/*
 * Ext JS Library 3.4.0
 * Copyright(c) 2006-2011 Sencha Inc.
 * licensing@sencha.com
 * http://www.sencha.com/license
 */
(function () {
		var h = Ext.util,
		j = Ext.each,
		g = true,
		i = false;
		h.Observable = function () {
			var k = this,
			l = k.events;
			if (k.listeners) {
				k.on(k.listeners);
				delete k.listeners
			}
			k.events = l || {}
				
		};
		h.Observable.prototype = {
			filterOptRe : /^(?:scope|delay|buffer|single)$/,
			fireEvent : function () {
				var k = Array.prototype.slice.call(arguments, 0),
				m = k[0].toLowerCase(),
				n = this,
				l = g,
				p = n.events[m],
				s,
				o,
				r;
				if (n.eventsSuspended === g) {
					if (o = n.eventQueue) {
						o.push(k)
					}
				} else {
					if (typeof p == "object") {
						if (p.bubble) {
							if (p.fire.apply(p, k.slice(1)) === i) {
								return i
							}
							r = n.getBubbleTarget && n.getBubbleTarget();
							if (r && r.enableBubble) {
								s = r.events[m];
								if (!s || typeof s != "object" || !s.bubble) {
									r.enableBubble(m)
								}
								return r.fireEvent.apply(r, k)
							}
						} else {
							k.shift();
							l = p.fire.apply(p, k)
						}
					}
				}
				return l
			},
			addListener : function (k, m, l, r) {
				var n = this,
				q,
				s,
				p;
				if (typeof k == "object") {
					r = k;
					for (q in r) {
						s = r[q];
						if (!n.filterOptRe.test(q)) {
							n.addListener(q, s.fn || s, s.scope || r.scope, s.fn ? s : r)
						}
					}
				} else {
					k = k.toLowerCase();
					p = n.events[k] || g;
					if (typeof p == "boolean") {
						n.events[k] = p = new h.Event(n, k)
					}
					p.addListener(m, l, typeof r == "object" ? r : {})
				}
			},
			removeListener : function (k, m, l) {
				var n = this.events[k.toLowerCase()];
				if (typeof n == "object") {
					n.removeListener(m, l)
				}
			},
			purgeListeners : function () {
				var m = this.events,
				k,
				l;
				for (l in m) {
					k = m[l];
					if (typeof k == "object") {
						k.clearListeners()
					}
				}
			},
			addEvents : function (n) {
				var m = this;
				m.events = m.events || {};
				if (typeof n == "string") {
					var k = arguments,
					l = k.length;
					while (l--) {
						m.events[k[l]] = m.events[k[l]] || g
					}
				} else {
					Ext.applyIf(m.events, n)
				}
			},
			hasListener : function (k) {
				var l = this.events[k.toLowerCase()];
				return typeof l == "object" && l.listeners.length > 0
			},
			suspendEvents : function (k) {
				this.eventsSuspended = g;
				if (k && !this.eventQueue) {
					this.eventQueue = []
				}
			},
			resumeEvents : function () {
				var k = this,
				l = k.eventQueue || [];
				k.eventsSuspended = i;
				delete k.eventQueue;
				j(l, function (m) {
						k.fireEvent.apply(k, m)
					})
			}
		};
		var d = h.Observable.prototype;
		d.on = d.addListener;
		d.un = d.removeListener;
		h.Observable.releaseCapture = function (k) {
			k.fireEvent = d.fireEvent
		};
		function e(l, m, k) {
			return function () {
				if (m.target == arguments[0]) {
					l.apply(k, Array.prototype.slice.call(arguments, 0))
				}
			}
		}
		function b(n, p, k, m) {
			k.task = new h.DelayedTask();
			return function () {
				k.task.delay(p.buffer, n, m, Array.prototype.slice.call(arguments, 0))
			}
		}
		function c(m, n, l, k) {
			return function () {
				n.removeListener(l, k);
				return m.apply(k, arguments)
			}
		}
		function a(n, p, k, m) {
			return function () {
				var l = new h.DelayedTask(),
				o = Array.prototype.slice.call(arguments, 0);
				if (!k.tasks) {
					k.tasks = []
				}
				k.tasks.push(l);
				l.delay(p.delay || 10, function () {
						k.tasks.remove(l);
						n.apply(m, o)
					}, m)
			}
		}
		h.Event = function (l, k) {
			this.name = k;
			this.obj = l;
			this.listeners = []
		};
		h.Event.prototype = {
			addListener : function (o, n, m) {
				var p = this,
				k;
				n = n || p.obj;
				if (!p.isListening(o, n)) {
					k = p.createListener(o, n, m);
					if (p.firing) {
						p.listeners = p.listeners.slice(0)
					}
					p.listeners.push(k)
				}
			},
			createListener : function (p, n, q) {
				q = q || {};
				n = n || this.obj;
				var k = {
					fn : p,
					scope : n,
					options : q
				},
				m = p;
				if (q.target) {
					m = e(m, q, n)
				}
				if (q.delay) {
					m = a(m, q, k, n)
				}
				if (q.single) {
					m = c(m, this, p, n)
				}
				if (q.buffer) {
					m = b(m, q, k, n)
				}
				k.fireFn = m;
				return k
			},
			findListener : function (o, n) {
				var p = this.listeners,
				m = p.length,
				k;
				n = n || this.obj;
				while (m--) {
					k = p[m];
					if (k) {
						if (k.fn == o && k.scope == n) {
							return m
						}
					}
				}
				return -1
			},
			isListening : function (l, k) {
				return this.findListener(l, k) != -1
			},
			removeListener : function (r, q) {
				var p,
				m,
				n,
				s = this,
				o = i;
				if ((p = s.findListener(r, q)) != -1) {
					if (s.firing) {
						s.listeners = s.listeners.slice(0)
					}
					m = s.listeners[p];
					if (m.task) {
						m.task.cancel();
						delete m.task
					}
					n = m.tasks && m.tasks.length;
					if (n) {
						while (n--) {
							m.tasks[n].cancel()
						}
						delete m.tasks
					}
					s.listeners.splice(p, 1);
					o = g
				}
				return o
			},
			clearListeners : function () {
				var n = this,
				k = n.listeners,
				m = k.length;
				while (m--) {
					n.removeListener(k[m].fn, k[m].scope)
				}
			},
			fire : function () {
				var q = this,
				p = q.listeners,
				k = p.length,
				o = 0,
				m;
				if (k > 0) {
					q.firing = g;
					var n = Array.prototype.slice.call(arguments, 0);
					for (; o < k; o++) {
						m = p[o];
						if (m && m.fireFn.apply(m.scope || q.obj || window, n) === i) {
							return (q.firing = i)
						}
					}
				}
				q.firing = i;
				return g
			}
		}
	})();
Ext.DomHelper = function () {
	var x = null,
	k = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i,
	m = /^table|tbody|tr|td$/i,
	d = /tag|children|cn|html$/i,
	t = /td|tr|tbody/i,
	o = /([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,
	v = /end/i,
	r,
	n = "afterbegin",
	p = "afterend",
	c = "beforebegin",
	q = "beforeend",
	a = "<table>",
	i = "</table>",
	b = a + "<tbody>",
	j = "</tbody>" + i,
	l = b + "<tr>",
	w = "</tr>" + j;
	function h(B, D, C, E, A, y) {
		var z = r.insertHtml(E, Ext.getDom(B), u(D));
		return C ? Ext.get(z, true) : z
	}
	function u(D) {
		var z = "",
		y,
		C,
		B,
		E;
		if (typeof D == "string") {
			z = D
		} else {
			if (Ext.isArray(D)) {
				for (var A = 0; A < D.length; A++) {
					if (D[A]) {
						z += u(D[A])
					}
				}
			} else {
				z += "<" + (D.tag = D.tag || "div");
				for (y in D) {
					C = D[y];
					if (!d.test(y)) {
						if (typeof C == "object") {
							z += " " + y + '="';
							for (B in C) {
								z += B + ":" + C[B] + ";"
							}
							z += '"'
						} else {
							z += " " + ({
									cls : "class",
									htmlFor : "for"
								}
								[y] || y) + '="' + C + '"'
						}
					}
				}
				if (k.test(D.tag)) {
					z += "/>"
				} else {
					z += ">";
					if ((E = D.children || D.cn)) {
						z += u(E)
					} else {
						if (D.html) {
							z += D.html
						}
					}
					z += "</" + D.tag + ">"
				}
			}
		}
		return z
	}
	function g(F, C, B, D) {
		x.innerHTML = [C, B, D].join("");
		var y = -1,
		A = x,
		z;
		while (++y < F) {
			A = A.firstChild
		}
		if (z = A.nextSibling) {
			var E = document.createDocumentFragment();
			while (A) {
				z = A.nextSibling;
				E.appendChild(A);
				A = z
			}
			A = E
		}
		return A
	}
	function e(y, z, B, A) {
		var C,
		D;
		x = x || document.createElement("div");
		if (y == "td" && (z == n || z == q) || !t.test(y) && (z == c || z == p)) {
			return
		}
		D = z == c ? B : z == p ? B.nextSibling : z == n ? B.firstChild : null;
		if (z == c || z == p) {
			B = B.parentNode
		}
		if (y == "td" || (y == "tr" && (z == q || z == n))) {
			C = g(4, l, A, w)
		} else {
			if ((y == "tbody" && (z == q || z == n)) || (y == "tr" && (z == c || z == p))) {
				C = g(3, b, A, j)
			} else {
				C = g(2, a, A, i)
			}
		}
		B.insertBefore(C, D);
		return C
	}
	function s(A) {
		var D = document.createElement("div"),
		y = document.createDocumentFragment(),
		z = 0,
		B,
		C;
		D.innerHTML = A;
		C = D.childNodes;
		B = C.length;
		for (; z < B; z++) {
			y.appendChild(C[z].cloneNode(true))
		}
		return y
	}
	r = {
		markup : function (y) {
			return u(y)
		},
		applyStyles : function (y, z) {
			if (z) {
				var A;
				y = Ext.fly(y);
				if (typeof z == "function") {
					z = z.call()
				}
				if (typeof z == "string") {
					o.lastIndex = 0;
					while ((A = o.exec(z))) {
						y.setStyle(A[1], A[2])
					}
				} else {
					if (typeof z == "object") {
						y.setStyle(z)
					}
				}
			}
		},
		insertHtml : function (D, y, E) {
			var B = {},
			A,
			F,
			C,
			G,
			H,
			z;
			D = D.toLowerCase();
			B[c] = ["BeforeBegin", "previousSibling"];
			B[p] = ["AfterEnd", "nextSibling"];
			if (y.insertAdjacentHTML) {
				if (m.test(y.tagName) && (z = e(y.tagName.toLowerCase(), D, y, E))) {
					return z
				}
				B[n] = ["AfterBegin", "firstChild"];
				B[q] = ["BeforeEnd", "lastChild"];
				if ((A = B[D])) {
					y.insertAdjacentHTML(A[0], E);
					return y[A[1]]
				}
			} else {
				F = y.ownerDocument.createRange();
				G = "setStart" + (v.test(D) ? "After" : "Before");
				if (B[D]) {
					F[G](y);
					if (!F.createContextualFragment) {
						H = s(E)
					} else {
						H = F.createContextualFragment(E)
					}
					y.parentNode.insertBefore(H, D == c ? y : y.nextSibling);
					return y[(D == c ? "previous" : "next") + "Sibling"]
				} else {
					C = (D == n ? "first" : "last") + "Child";
					if (y.firstChild) {
						F[G](y[C]);
						if (!F.createContextualFragment) {
							H = s(E)
						} else {
							H = F.createContextualFragment(E)
						}
						if (D == n) {
							y.insertBefore(H, y.firstChild)
						} else {
							y.appendChild(H)
						}
					} else {
						y.innerHTML = E
					}
					return y[C]
				}
			}
			throw 'Illegal insertion point -> "' + D + '"'
		},
		insertBefore : function (y, A, z) {
			return h(y, A, z, c)
		},
		insertAfter : function (y, A, z) {
			return h(y, A, z, p, "nextSibling")
		},
		insertFirst : function (y, A, z) {
			return h(y, A, z, n, "firstChild")
		},
		append : function (y, A, z) {
			return h(y, A, z, q, "", true)
		},
		overwrite : function (y, A, z) {
			y = Ext.getDom(y);
			y.innerHTML = u(A);
			return z ? Ext.get(y.firstChild) : y.firstChild
		},
		createHtml : u
	};
	return r
}
();
Ext.Template = function (h) {
	var j = this,
	c = arguments,
	e = [],
	d;
	if (Ext.isArray(h)) {
		h = h.join("")
	} else {
		if (c.length > 1) {
			for (var g = 0, b = c.length; g < b; g++) {
				d = c[g];
				if (typeof d == "object") {
					Ext.apply(j, d)
				} else {
					e.push(d)
				}
			}
			h = e.join("")
		}
	}
	j.html = h;
	if (j.compiled) {
		j.compile()
	}
};
Ext.Template.prototype = {
	re : /\{([\w\-]+)\}/g,
	applyTemplate : function (a) {
		var b = this;
		return b.compiled ? b.compiled(a) : b.html.replace(b.re, function (c, d) {
				return a[d] !== undefined ? a[d] : ""
			})
	},
	set : function (a, c) {
		var b = this;
		b.html = a;
		b.compiled = null;
		return c ? b.compile() : b
	},
	compile : function () {
		var me = this,
		sep = Ext.isGecko ? "+" : ",";
		function fn(m, name) {
			name = "values['" + name + "']";
			return "'" + sep + "(" + name + " == undefined ? '' : " + name + ")" + sep + "'"
		}
		eval("this.compiled = function(values){ return " + (Ext.isGecko ? "'" : "['") + me.html.replace(/\\/g, "\\\\").replace(/(\r\n|\n)/g, "\\n").replace(/'/g, "\\'").replace(this.re, fn) + (Ext.isGecko ? "';};" : "'].join('');};"));
		return me
	},
	insertFirst : function (b, a, c) {
		return this.doInsert("afterBegin", b, a, c)
	},
	insertBefore : function (b, a, c) {
		return this.doInsert("beforeBegin", b, a, c)
	},
	insertAfter : function (b, a, c) {
		return this.doInsert("afterEnd", b, a, c)
	},
	append : function (b, a, c) {
		return this.doInsert("beforeEnd", b, a, c)
	},
	doInsert : function (c, e, b, a) {
		e = Ext.getDom(e);
		var d = Ext.DomHelper.insertHtml(c, e, this.applyTemplate(b));
		return a ? Ext.get(d, true) : d
	},
	overwrite : function (b, a, c) {
		b = Ext.getDom(b);
		b.innerHTML = this.applyTemplate(a);
		return c ? Ext.get(b.firstChild, true) : b.firstChild
	}
};
Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;
Ext.Template.from = function (b, a) {
	b = Ext.getDom(b);
	return new Ext.Template(b.value || b.innerHTML, a || "")
};
Ext.DomQuery = function () {
	var cache = {},
	simpleCache = {},
	valueCache = {},
	nonSpace = /\S/,
	trimRe = /^\s+|\s+$/g,
	tplRe = /\{(\d+)\}/g,
	modeRe = /^(\s?[\/>+~]\s?|\s|$)/,
	tagTokenRe = /^(#)?([\w\-\*]+)/,
	nthRe = /(\d*)n\+?(\d*)/,
	nthRe2 = /\D/,
	isIE = window.ActiveXObject ? true : false,
	key = 30803;
	eval("var batch = 30803;");
	function child(parent, index) {
		var i = 0,
		n = parent.firstChild;
		while (n) {
			if (n.nodeType == 1) {
				if (++i == index) {
					return n
				}
			}
			n = n.nextSibling
		}
		return null
	}
	function next(n) {
		while ((n = n.nextSibling) && n.nodeType != 1) {}
		
		return n
	}
	function prev(n) {
		while ((n = n.previousSibling) && n.nodeType != 1) {}
		
		return n
	}
	function children(parent) {
		var n = parent.firstChild,
		nodeIndex = -1,
		nextNode;
		while (n) {
			nextNode = n.nextSibling;
			if (n.nodeType == 3 && !nonSpace.test(n.nodeValue)) {
				parent.removeChild(n)
			} else {
				n.nodeIndex = ++nodeIndex
			}
			n = nextNode
		}
		return this
	}
	function byClassName(nodeSet, cls) {
		if (!cls) {
			return nodeSet
		}
		var result = [],
		ri = -1;
		for (var i = 0, ci; ci = nodeSet[i]; i++) {
			if ((" " + ci.className + " ").indexOf(cls) != -1) {
				result[++ri] = ci
			}
		}
		return result
	}
	function attrValue(n, attr) {
		if (!n.tagName && typeof n.length != "undefined") {
			n = n[0]
		}
		if (!n) {
			return null
		}
		if (attr == "for") {
			return n.htmlFor
		}
		if (attr == "class" || attr == "className") {
			return n.className
		}
		return n.getAttribute(attr) || n[attr]
	}
	function getNodes(ns, mode, tagName) {
		var result = [],
		ri = -1,
		cs;
		if (!ns) {
			return result
		}
		tagName = tagName || "*";
		if (typeof ns.getElementsByTagName != "undefined") {
			ns = [ns]
		}
		if (!mode) {
			for (var i = 0, ni; ni = ns[i]; i++) {
				cs = ni.getElementsByTagName(tagName);
				for (var j = 0, ci; ci = cs[j]; j++) {
					result[++ri] = ci
				}
			}
		} else {
			if (mode == "/" || mode == ">") {
				var utag = tagName.toUpperCase();
				for (var i = 0, ni, cn; ni = ns[i]; i++) {
					cn = ni.childNodes;
					for (var j = 0, cj; cj = cn[j]; j++) {
						if (cj.nodeName == utag || cj.nodeName == tagName || tagName == "*") {
							result[++ri] = cj
						}
					}
				}
			} else {
				if (mode == "+") {
					var utag = tagName.toUpperCase();
					for (var i = 0, n; n = ns[i]; i++) {
						while ((n = n.nextSibling) && n.nodeType != 1) {}
						
						if (n && (n.nodeName == utag || n.nodeName == tagName || tagName == "*")) {
							result[++ri] = n
						}
					}
				} else {
					if (mode == "~") {
						var utag = tagName.toUpperCase();
						for (var i = 0, n; n = ns[i]; i++) {
							while ((n = n.nextSibling)) {
								if (n.nodeName == utag || n.nodeName == tagName || tagName == "*") {
									result[++ri] = n
								}
							}
						}
					}
				}
			}
		}
		return result
	}
	function concat(a, b) {
		if (b.slice) {
			return a.concat(b)
		}
		for (var i = 0, l = b.length; i < l; i++) {
			a[a.length] = b[i]
		}
		return a
	}
	function byTag(cs, tagName) {
		if (cs.tagName || cs == document) {
			cs = [cs]
		}
		if (!tagName) {
			return cs
		}
		var result = [],
		ri = -1;
		tagName = tagName.toLowerCase();
		for (var i = 0, ci; ci = cs[i]; i++) {
			if (ci.nodeType == 1 && ci.tagName.toLowerCase() == tagName) {
				result[++ri] = ci
			}
		}
		return result
	}
	function byId(cs, id) {
		if (cs.tagName || cs == document) {
			cs = [cs]
		}
		if (!id) {
			return cs
		}
		var result = [],
		ri = -1;
		for (var i = 0, ci; ci = cs[i]; i++) {
			if (ci && ci.id == id) {
				result[++ri] = ci;
				return result
			}
		}
		return result
	}
	function byAttribute(cs, attr, value, op, custom) {
		var result = [],
		ri = -1,
		useGetStyle = custom == "{",
		fn = Ext.DomQuery.operators[op],
		a,
		xml,
		hasXml;
		for (var i = 0, ci; ci = cs[i]; i++) {
			if (ci.nodeType != 1) {
				continue
			}
			if (!hasXml) {
				xml = Ext.DomQuery.isXml(ci);
				hasXml = true
			}
			if (!xml) {
				if (useGetStyle) {
					a = Ext.DomQuery.getStyle(ci, attr)
				} else {
					if (attr == "class" || attr == "className") {
						a = ci.className
					} else {
						if (attr == "for") {
							a = ci.htmlFor
						} else {
							if (attr == "href") {
								a = ci.getAttribute("href", 2)
							} else {
								a = ci.getAttribute(attr)
							}
						}
					}
				}
			} else {
				a = ci.getAttribute(attr)
			}
			if ((fn && fn(a, value)) || (!fn && a)) {
				result[++ri] = ci
			}
		}
		return result
	}
	function byPseudo(cs, name, value) {
		return Ext.DomQuery.pseudos[name](cs, value)
	}
	function nodupIEXml(cs) {
		var d = ++key,
		r;
		cs[0].setAttribute("_nodup", d);
		r = [cs[0]];
		for (var i = 1, len = cs.length; i < len; i++) {
			var c = cs[i];
			if (!c.getAttribute("_nodup") != d) {
				c.setAttribute("_nodup", d);
				r[r.length] = c
			}
		}
		for (var i = 0, len = cs.length; i < len; i++) {
			cs[i].removeAttribute("_nodup")
		}
		return r
	}
	function nodup(cs) {
		if (!cs) {
			return []
		}
		var len = cs.length,
		c,
		i,
		r = cs,
		cj,
		ri = -1;
		if (!len || typeof cs.nodeType != "undefined" || len == 1) {
			return cs
		}
		if (isIE && typeof cs[0].selectSingleNode != "undefined") {
			return nodupIEXml(cs)
		}
		var d = ++key;
		cs[0]._nodup = d;
		for (i = 1; c = cs[i]; i++) {
			if (c._nodup != d) {
				c._nodup = d
			} else {
				r = [];
				for (var j = 0; j < i; j++) {
					r[++ri] = cs[j]
				}
				for (j = i + 1; cj = cs[j]; j++) {
					if (cj._nodup != d) {
						cj._nodup = d;
						r[++ri] = cj
					}
				}
				return r
			}
		}
		return r
	}
	function quickDiffIEXml(c1, c2) {
		var d = ++key,
		r = [];
		for (var i = 0, len = c1.length; i < len; i++) {
			c1[i].setAttribute("_qdiff", d)
		}
		for (var i = 0, len = c2.length; i < len; i++) {
			if (c2[i].getAttribute("_qdiff") != d) {
				r[r.length] = c2[i]
			}
		}
		for (var i = 0, len = c1.length; i < len; i++) {
			c1[i].removeAttribute("_qdiff")
		}
		return r
	}
	function quickDiff(c1, c2) {
		var len1 = c1.length,
		d = ++key,
		r = [];
		if (!len1) {
			return c2
		}
		if (isIE && typeof c1[0].selectSingleNode != "undefined") {
			return quickDiffIEXml(c1, c2)
		}
		for (var i = 0; i < len1; i++) {
			c1[i]._qdiff = d
		}
		for (var i = 0, len = c2.length; i < len; i++) {
			if (c2[i]._qdiff != d) {
				r[r.length] = c2[i]
			}
		}
		return r
	}
	function quickId(ns, mode, root, id) {
		if (ns == root) {
			var d = root.ownerDocument || root;
			return d.getElementById(id)
		}
		ns = getNodes(ns, mode, "*");
		return byId(ns, id)
	}
	return {
		getStyle : function (el, name) {
			return Ext.fly(el).getStyle(name)
		},
		compile : function (path, type) {
			type = type || "select";
			var fn = ["var f = function(root){\n var mode; ++batch; var n = root || document;\n"],
			mode,
			lastPath,
			matchers = Ext.DomQuery.matchers,
			matchersLn = matchers.length,
			modeMatch,
			lmode = path.match(modeRe);
			if (lmode && lmode[1]) {
				fn[fn.length] = 'mode="' + lmode[1].replace(trimRe, "") + '";';
				path = path.replace(lmode[1], "")
			}
			while (path.substr(0, 1) == "/") {
				path = path.substr(1)
			}
			while (path && lastPath != path) {
				lastPath = path;
				var tokenMatch = path.match(tagTokenRe);
				if (type == "select") {
					if (tokenMatch) {
						if (tokenMatch[1] == "#") {
							fn[fn.length] = 'n = quickId(n, mode, root, "' + tokenMatch[2] + '");'
						} else {
							fn[fn.length] = 'n = getNodes(n, mode, "' + tokenMatch[2] + '");'
						}
						path = path.replace(tokenMatch[0], "")
					} else {
						if (path.substr(0, 1) != "@") {
							fn[fn.length] = 'n = getNodes(n, mode, "*");'
						}
					}
				} else {
					if (tokenMatch) {
						if (tokenMatch[1] == "#") {
							fn[fn.length] = 'n = byId(n, "' + tokenMatch[2] + '");'
						} else {
							fn[fn.length] = 'n = byTag(n, "' + tokenMatch[2] + '");'
						}
						path = path.replace(tokenMatch[0], "")
					}
				}
				while (!(modeMatch = path.match(modeRe))) {
					var matched = false;
					for (var j = 0; j < matchersLn; j++) {
						var t = matchers[j];
						var m = path.match(t.re);
						if (m) {
							fn[fn.length] = t.select.replace(tplRe, function (x, i) {
										return m[i]
									});
							path = path.replace(m[0], "");
							matched = true;
							break
						}
					}
					if (!matched) {
						throw 'Error parsing selector, parsing failed at "' + path + '"'
					}
				}
				if (modeMatch[1]) {
					fn[fn.length] = 'mode="' + modeMatch[1].replace(trimRe, "") + '";';
					path = path.replace(modeMatch[1], "")
				}
			}
			fn[fn.length] = "return nodup(n);\n}";
			eval(fn.join(""));
			return f
		},
		jsSelect : function (path, root, type) {
			root = root || document;
			if (typeof root == "string") {
				root = document.getElementById(root)
			}
			var paths = path.split(","),
			results = [];
			for (var i = 0, len = paths.length; i < len; i++) {
				var subPath = paths[i].replace(trimRe, "");
				if (!cache[subPath]) {
					cache[subPath] = Ext.DomQuery.compile(subPath);
					if (!cache[subPath]) {
						throw subPath + " is not a valid selector"
					}
				}
				var result = cache[subPath](root);
				if (result && result != document) {
					results = results.concat(result)
				}
			}
			if (paths.length > 1) {
				return nodup(results)
			}
			return results
		},
		isXml : function (el) {
			var docEl = (el ? el.ownerDocument || el : 0).documentElement;
			return docEl ? docEl.nodeName !== "HTML" : false
		},
		select : document.querySelectorAll ? function (path, root, type) {
			root = root || document;
			if (!Ext.DomQuery.isXml(root)) {
				try {
					var cs = root.querySelectorAll(path);
					return Ext.toArray(cs)
				} catch (ex) {}
				
			}
			return Ext.DomQuery.jsSelect.call(this, path, root, type)
		}
		 : function (path, root, type) {
			return Ext.DomQuery.jsSelect.call(this, path, root, type)
		},
		selectNode : function (path, root) {
			return Ext.DomQuery.select(path, root)[0]
		},
		selectValue : function (path, root, defaultValue) {
			path = path.replace(trimRe, "");
			if (!valueCache[path]) {
				valueCache[path] = Ext.DomQuery.compile(path, "select")
			}
			var n = valueCache[path](root),
			v;
			n = n[0] ? n[0] : n;
			if (typeof n.normalize == "function") {
				n.normalize()
			}
			v = (n && n.firstChild ? n.firstChild.nodeValue : null);
			return ((v === null || v === undefined || v === "") ? defaultValue : v)
		},
		selectNumber : function (path, root, defaultValue) {
			var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0);
			return parseFloat(v)
		},
		is : function (el, ss) {
			if (typeof el == "string") {
				el = document.getElementById(el)
			}
			var isArray = Ext.isArray(el),
			result = Ext.DomQuery.filter(isArray ? el : [el], ss);
			return isArray ? (result.length == el.length) : (result.length > 0)
		},
		filter : function (els, ss, nonMatches) {
			ss = ss.replace(trimRe, "");
			if (!simpleCache[ss]) {
				simpleCache[ss] = Ext.DomQuery.compile(ss, "simple")
			}
			var result = simpleCache[ss](els);
			return nonMatches ? quickDiff(result, els) : result
		},
		matchers : [{
				re : /^\.([\w\-]+)/,
				select : 'n = byClassName(n, " {1} ");'
			}, {
				re : /^\:([\w\-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,
				select : 'n = byPseudo(n, "{1}", "{2}");'
			}, {
				re : /^(?:([\[\{])(?:@)?([\w\-]+)\s?(?:(=|.=)\s?(["']?)(.*?)\4)?[\]\}])/,
				select : 'n = byAttribute(n, "{2}", "{5}", "{3}", "{1}");'
			}, {
				re : /^#([\w\-]+)/,
				select : 'n = byId(n, "{1}");'
			}, {
				re : /^@([\w\-]+)/,
				select : 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'
			}
		],
		operators : {
			"=" : function (a, v) {
				return a == v
			},
			"!=" : function (a, v) {
				return a != v
			},
			"^=" : function (a, v) {
				return a && a.substr(0, v.length) == v
			},
			"$=" : function (a, v) {
				return a && a.substr(a.length - v.length) == v
			},
			"*=" : function (a, v) {
				return a && a.indexOf(v) !== -1
			},
			"%=" : function (a, v) {
				return (a % v) == 0
			},
			"|=" : function (a, v) {
				return a && (a == v || a.substr(0, v.length + 1) == v + "-")
			},
			"~=" : function (a, v) {
				return a && (" " + a + " ").indexOf(" " + v + " ") != -1
			}
		},
		pseudos : {
			"first-child" : function (c) {
				var r = [],
				ri = -1,
				n;
				for (var i = 0, ci; ci = n = c[i]; i++) {
					while ((n = n.previousSibling) && n.nodeType != 1) {}
					
					if (!n) {
						r[++ri] = ci
					}
				}
				return r
			},
			"last-child" : function (c) {
				var r = [],
				ri = -1,
				n;
				for (var i = 0, ci; ci = n = c[i]; i++) {
					while ((n = n.nextSibling) && n.nodeType != 1) {}
					
					if (!n) {
						r[++ri] = ci
					}
				}
				return r
			},
			"nth-child" : function (c, a) {
				var r = [],
				ri = -1,
				m = nthRe.exec(a == "even" && "2n" || a == "odd" && "2n+1" || !nthRe2.test(a) && "n+" + a || a),
				f = (m[1] || 1) - 0,
				l = m[2] - 0;
				for (var i = 0, n; n = c[i]; i++) {
					var pn = n.parentNode;
					if (batch != pn._batch) {
						var j = 0;
						for (var cn = pn.firstChild; cn; cn = cn.nextSibling) {
							if (cn.nodeType == 1) {
								cn.nodeIndex = ++j
							}
						}
						pn._batch = batch
					}
					if (f == 1) {
						if (l == 0 || n.nodeIndex == l) {
							r[++ri] = n
						}
					} else {
						if ((n.nodeIndex + l) % f == 0) {
							r[++ri] = n
						}
					}
				}
				return r
			},
			"only-child" : function (c) {
				var r = [],
				ri = -1;
				for (var i = 0, ci; ci = c[i]; i++) {
					if (!prev(ci) && !next(ci)) {
						r[++ri] = ci
					}
				}
				return r
			},
			empty : function (c) {
				var r = [],
				ri = -1;
				for (var i = 0, ci; ci = c[i]; i++) {
					var cns = ci.childNodes,
					j = 0,
					cn,
					empty = true;
					while (cn = cns[j]) {
						++j;
						if (cn.nodeType == 1 || cn.nodeType == 3) {
							empty = false;
							break
						}
					}
					if (empty) {
						r[++ri] = ci
					}
				}
				return r
			},
			contains : function (c, v) {
				var r = [],
				ri = -1;
				for (var i = 0, ci; ci = c[i]; i++) {
					if ((ci.textContent || ci.innerText || "").indexOf(v) != -1) {
						r[++ri] = ci
					}
				}
				return r
			},
			nodeValue : function (c, v) {
				var r = [],
				ri = -1;
				for (var i = 0, ci; ci = c[i]; i++) {
					if (ci.firstChild && ci.firstChild.nodeValue == v) {
						r[++ri] = ci
					}
				}
				return r
			},
			checked : function (c) {
				var r = [],
				ri = -1;
				for (var i = 0, ci; ci = c[i]; i++) {
					if (ci.checked == true) {
						r[++ri] = ci
					}
				}
				return r
			},
			not : function (c, ss) {
				return Ext.DomQuery.filter(c, ss, true)
			},
			any : function (c, selectors) {
				var ss = selectors.split("|"),
				r = [],
				ri = -1,
				s;
				for (var i = 0, ci; ci = c[i]; i++) {
					for (var j = 0; s = ss[j]; j++) {
						if (Ext.DomQuery.is(ci, s)) {
							r[++ri] = ci;
							break
						}
					}
				}
				return r
			},
			odd : function (c) {
				return this["nth-child"](c, "odd")
			},
			even : function (c) {
				return this["nth-child"](c, "even")
			},
			nth : function (c, a) {
				return c[a - 1] || []
			},
			first : function (c) {
				return c[0] || []
			},
			last : function (c) {
				return c[c.length - 1] || []
			},
			has : function (c, ss) {
				var s = Ext.DomQuery.select,
				r = [],
				ri = -1;
				for (var i = 0, ci; ci = c[i]; i++) {
					if (s(ss, ci).length > 0) {
						r[++ri] = ci
					}
				}
				return r
			},
			next : function (c, ss) {
				var is = Ext.DomQuery.is,
				r = [],
				ri = -1;
				for (var i = 0, ci; ci = c[i]; i++) {
					var n = next(ci);
					if (n && is(n, ss)) {
						r[++ri] = ci
					}
				}
				return r
			},
			prev : function (c, ss) {
				var is = Ext.DomQuery.is,
				r = [],
				ri = -1;
				for (var i = 0, ci; ci = c[i]; i++) {
					var n = prev(ci);
					if (n && is(n, ss)) {
						r[++ri] = ci
					}
				}
				return r
			}
		}
	}
}
();
Ext.query = Ext.DomQuery.select;
Ext.util.DelayedTask = function (d, c, a) {
	var e = this,
	g,
	b = function () {
		clearInterval(g);
		g = null;
		d.apply(c, a || [])
	};
	e.delay = function (i, k, j, h) {
		e.cancel();
		d = k || d;
		c = j || c;
		a = h || a;
		g = setInterval(b, i)
	};
	e.cancel = function () {
		if (g) {
			clearInterval(g);
			g = null
		}
	}
};
(function () {
		var h = document;
		Ext.Element = function (l, m) {
			var n = typeof l == "string" ? h.getElementById(l) : l,
			o;
			if (!n) {
				return null
			}
			o = n.id;
			if (!m && o && Ext.elCache[o]) {
				return Ext.elCache[o].el
			}
			this.dom = n;
			this.id = o || Ext.id(n)
		};
		var d = Ext.DomHelper,
		e = Ext.Element,
		a = Ext.elCache;
		e.prototype = {
			set : function (q, m) {
				var n = this.dom,
				l,
				p,
				m = (m !== false) && !!n.setAttribute;
				for (l in q) {
					if (q.hasOwnProperty(l)) {
						p = q[l];
						if (l == "style") {
							d.applyStyles(n, p)
						} else {
							if (l == "cls") {
								n.className = p
							} else {
								if (m) {
									n.setAttribute(l, p)
								} else {
									n[l] = p
								}
							}
						}
					}
				}
				return this
			},
			defaultUnit : "px",
			is : function (l) {
				return Ext.DomQuery.is(this.dom, l)
			},
			focus : function (o, n) {
				var l = this,
				n = n || l.dom;
				try {
					if (Number(o)) {
						l.focus.defer(o, null, [null, n])
					} else {
						n.focus()
					}
				} catch (m) {}
				
				return l
			},
			blur : function () {
				try {
					this.dom.blur()
				} catch (l) {}
				
				return this
			},
			getValue : function (l) {
				var m = this.dom.value;
				return l ? parseInt(m, 10) : m
			},
			addListener : function (l, o, n, m) {
				Ext.EventManager.on(this.dom, l, o, n || this, m);
				return this
			},
			removeListener : function (l, n, m) {
				Ext.EventManager.removeListener(this.dom, l, n, m || this);
				return this
			},
			removeAllListeners : function () {
				Ext.EventManager.removeAll(this.dom);
				return this
			},
			purgeAllListeners : function () {
				Ext.EventManager.purgeElement(this, true);
				return this
			},
			addUnits : function (l) {
				if (l === "" || l == "auto" || l === undefined) {
					l = l || ""
				} else {
					if (!isNaN(l) || !i.test(l)) {
						l = l + (this.defaultUnit || "px")
					}
				}
				return l
			},
			load : function (m, n, l) {
				Ext.Ajax.request(Ext.apply({
							params : n,
							url : m.url || m,
							callback : l,
							el : this.dom,
							indicatorText : m.indicatorText || ""
						}, Ext.isObject(m) ? m : {}));
				return this
			},
			isBorderBox : function () {
				return Ext.isBorderBox || Ext.isForcedBorderBox || g[(this.dom.tagName || "").toLowerCase()]
			},
			remove : function () {
				var l = this,
				m = l.dom;
				if (m) {
					delete l.dom;
					Ext.removeNode(m)
				}
			},
			hover : function (m, l, o, n) {
				var p = this;
				p.on("mouseenter", m, o || p.dom, n);
				p.on("mouseleave", l, o || p.dom, n);
				return p
			},
			contains : function (l) {
				return !l ? false : Ext.lib.Dom.isAncestor(this.dom, l.dom ? l.dom : l)
			},
			getAttributeNS : function (m, l) {
				return this.getAttribute(l, m)
			},
			getAttribute : (function () {
					var p = document.createElement("table"),
					o = false,
					m = "getAttribute" in p,
					l = /undefined|unknown/;
					if (m) {
						try {
							p.getAttribute("ext:qtip")
						} catch (n) {
							o = true
						}
						return function (q, s) {
							var r = this.dom,
							t;
							if (r.getAttributeNS) {
								t = r.getAttributeNS(s, q) || null
							}
							if (t == null) {
								if (s) {
									if (o && r.tagName.toUpperCase() == "TABLE") {
										try {
											t = r.getAttribute(s + ":" + q)
										} catch (u) {
											t = ""
										}
									} else {
										t = r.getAttribute(s + ":" + q)
									}
								} else {
									t = r.getAttribute(q) || r[q]
								}
							}
							return t || ""
						}
					} else {
						return function (q, s) {
							var r = this.om,
							u,
							t;
							if (s) {
								t = r[s + ":" + q];
								u = l.test(typeof t) ? undefined : t
							} else {
								u = r[q]
							}
							return u || ""
						}
					}
					p = null
				})(),
			update : function (l) {
				if (this.dom) {
					this.dom.innerHTML = l
				}
				return this
			}
		};
		var k = e.prototype;
		e.addMethods = function (l) {
			Ext.apply(k, l)
		};
		k.on = k.addListener;
		k.un = k.removeListener;
		k.autoBoxAdjust = true;
		var i = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,
		c;
		e.get = function (m) {
			var l,
			p,
			o;
			if (!m) {
				return null
			}
			if (typeof m == "string") {
				if (!(p = h.getElementById(m))) {
					return null
				}
				if (a[m] && a[m].el) {
					l = a[m].el;
					l.dom = p
				} else {
					l = e.addToCache(new e(p))
				}
				return l
			} else {
				if (m.tagName) {
					if (!(o = m.id)) {
						o = Ext.id(m)
					}
					if (a[o] && a[o].el) {
						l = a[o].el;
						l.dom = m
					} else {
						l = e.addToCache(new e(m))
					}
					return l
				} else {
					if (m instanceof e) {
						if (m != c) {
							if (Ext.isIE && (m.id == undefined || m.id == "")) {
								m.dom = m.dom
							} else {
								m.dom = h.getElementById(m.id) || m.dom
							}
						}
						return m
					} else {
						if (m.isComposite) {
							return m
						} else {
							if (Ext.isArray(m)) {
								return e.select(m)
							} else {
								if (m == h) {
									if (!c) {
										var n = function () {};
										n.prototype = e.prototype;
										c = new n();
										c.dom = h
									}
									return c
								}
							}
						}
					}
				}
			}
			return null
		};
		e.addToCache = function (l, m) {
			m = m || l.id;
			a[m] = {
				el : l,
				data : {},
				events : {}
				
			};
			return l
		};
		e.data = function (m, l, n) {
			m = e.get(m);
			if (!m) {
				return null
			}
			var o = a[m.id].data;
			if (arguments.length == 2) {
				return o[l]
			} else {
				return (o[l] = n)
			}
		};
		function j() {
			if (!Ext.enableGarbageCollector) {
				clearInterval(e.collectorThreadId)
			} else {
				var l,
				n,
				q,
				p;
				for (l in a) {
					p = a[l];
					if (p.skipGC) {
						continue
					}
					n = p.el;
					q = n.dom;
					if (!q || !q.parentNode || (!q.offsetParent && !h.getElementById(l))) {
						if (Ext.enableListenerCollection) {
							Ext.EventManager.removeAll(q)
						}
						delete a[l]
					}
				}
				if (Ext.isIE) {
					var m = {};
					for (l in a) {
						m[l] = a[l]
					}
					a = Ext.elCache = m
				}
			}
		}
		e.collectorThreadId = setInterval(j, 30000);
		var b = function () {};
		b.prototype = e.prototype;
		e.Flyweight = function (l) {
			this.dom = l
		};
		e.Flyweight.prototype = new b();
		e.Flyweight.prototype.isFlyweight = true;
		e._flyweights = {};
		e.fly = function (n, l) {
			var m = null;
			l = l || "_global";
			if (n = Ext.getDom(n)) {
				(e._flyweights[l] = e._flyweights[l] || new e.Flyweight()).dom = n;
				m = e._flyweights[l]
			}
			return m
		};
		Ext.get = e.get;
		Ext.fly = e.fly;
		var g = Ext.isStrict ? {
				select : 1
			}
			 : {
				input : 1,
				select : 1,
				textarea : 1
			};
		if (Ext.isIE || Ext.isGecko) {
			g.button = 1
		}
	})();
Ext.Element.addMethods(function () {
		var d = "parentNode",
		b = "nextSibling",
		c = "previousSibling",
		e = Ext.DomQuery,
		a = Ext.get;
		return {
			findParent : function (m, l, h) {
				var j = this.dom,
				g = document.body,
				k = 0,
				i;
				if (Ext.isGecko && Object.prototype.toString.call(j) == "[object XULElement]") {
					return null
				}
				l = l || 50;
				if (isNaN(l)) {
					i = Ext.getDom(l);
					l = Number.MAX_VALUE
				}
				while (j && j.nodeType == 1 && k < l && j != g && j != i) {
					if (e.is(j, m)) {
						return h ? a(j) : j
					}
					k++;
					j = j.parentNode
				}
				return null
			},
			findParentNode : function (j, i, g) {
				var h = Ext.fly(this.dom.parentNode, "_internal");
				return h ? h.findParent(j, i, g) : null
			},
			up : function (h, g) {
				return this.findParentNode(h, g, true)
			},
			select : function (g) {
				return Ext.Element.select(g, this.dom)
			},
			query : function (g) {
				return e.select(g, this.dom)
			},
			child : function (g, h) {
				var i = e.selectNode(g, this.dom);
				return h ? i : a(i)
			},
			down : function (g, h) {
				var i = e.selectNode(" > " + g, this.dom);
				return h ? i : a(i)
			},
			parent : function (g, h) {
				return this.matchNode(d, d, g, h)
			},
			next : function (g, h) {
				return this.matchNode(b, b, g, h)
			},
			prev : function (g, h) {
				return this.matchNode(c, c, g, h)
			},
			first : function (g, h) {
				return this.matchNode(b, "firstChild", g, h)
			},
			last : function (g, h) {
				return this.matchNode(c, "lastChild", g, h)
			},
			matchNode : function (h, k, g, i) {
				var j = this.dom[k];
				while (j) {
					if (j.nodeType == 1 && (!g || e.is(j, g))) {
						return !i ? a(j) : j
					}
					j = j[h]
				}
				return null
			}
		}
	}
	());
Ext.Element.addMethods(function () {
		var c = Ext.getDom,
		a = Ext.get,
		b = Ext.DomHelper;
		return {
			appendChild : function (d) {
				return a(d).appendTo(this)
			},
			appendTo : function (d) {
				c(d).appendChild(this.dom);
				return this
			},
			insertBefore : function (d) {
				(d = c(d)).parentNode.insertBefore(this.dom, d);
				return this
			},
			insertAfter : function (d) {
				(d = c(d)).parentNode.insertBefore(this.dom, d.nextSibling);
				return this
			},
			insertFirst : function (e, d) {
				e = e || {};
				if (e.nodeType || e.dom || typeof e == "string") {
					e = c(e);
					this.dom.insertBefore(e, this.dom.firstChild);
					return !d ? a(e) : e
				} else {
					return this.createChild(e, this.dom.firstChild, d)
				}
			},
			replace : function (d) {
				d = a(d);
				this.insertBefore(d);
				d.remove();
				return this
			},
			replaceWith : function (d) {
				var e = this;
				if (d.nodeType || d.dom || typeof d == "string") {
					d = c(d);
					e.dom.parentNode.insertBefore(d, e.dom)
				} else {
					d = b.insertBefore(e.dom, d)
				}
				delete Ext.elCache[e.id];
				Ext.removeNode(e.dom);
				e.id = Ext.id(e.dom = d);
				Ext.Element.addToCache(e.isFlyweight ? new Ext.Element(e.dom) : e);
				return e
			},
			createChild : function (e, d, g) {
				e = e || {
						tag : "div"
					};
				return d ? b.insertBefore(d, e, g !== true) : b[!this.dom.firstChild ? "overwrite" : "append"](this.dom, e, g !== true)
			},
			wrap : function (d, e) {
				var g = b.insertBefore(this.dom, d || {
							tag : "div"
						}, !e);
				g.dom ? g.dom.appendChild(this.dom) : g.appendChild(this.dom);
				return g
			},
			insertHtml : function (e, g, d) {
				var h = b.insertHtml(e, this.dom, g);
				return d ? Ext.get(h) : h
			}
		}
	}
	());
Ext.Element.addMethods(function () {
		var A = Ext.supports,
		h = {},
		x = /(-[a-z])/gi,
		s = document.defaultView,
		D = /alpha\(opacity=(.*)\)/i,
		l = /^\s+|\s+$/g,
		B = Ext.Element,
		u = /\s+/,
		b = /\w/g,
		d = "padding",
		c = "margin",
		y = "border",
		t = "-left",
		q = "-right",
		w = "-top",
		o = "-bottom",
		j = "-width",
		r = Math,
		z = "hidden",
		e = "isClipped",
		k = "overflow",
		n = "overflow-x",
		m = "overflow-y",
		C = "originalClip",
		i = {
			l : y + t + j,
			r : y + q + j,
			t : y + w + j,
			b : y + o + j
		},
		g = {
			l : d + t,
			r : d + q,
			t : d + w,
			b : d + o
		},
		a = {
			l : c + t,
			r : c + q,
			t : c + w,
			b : c + o
		},
		E = Ext.Element.data;
		function p(F, G) {
			return G.charAt(1).toUpperCase()
		}
		function v(F) {
			return h[F] || (h[F] = F == "float" ? (A.cssFloat ? "cssFloat" : "styleFloat") : F.replace(x, p))
		}
		return {
			adjustWidth : function (F) {
				var G = this;
				var H = (typeof F == "number");
				if (H && G.autoBoxAdjust && !G.isBorderBox()) {
					F -= (G.getBorderWidth("lr") + G.getPadding("lr"))
				}
				return (H && F < 0) ? 0 : F
			},
			adjustHeight : function (F) {
				var G = this;
				var H = (typeof F == "number");
				if (H && G.autoBoxAdjust && !G.isBorderBox()) {
					F -= (G.getBorderWidth("tb") + G.getPadding("tb"))
				}
				return (H && F < 0) ? 0 : F
			},
			addClass : function (J) {
				var K = this,
				I,
				F,
				H,
				G = [];
				if (!Ext.isArray(J)) {
					if (typeof J == "string" && !this.hasClass(J)) {
						K.dom.className += " " + J
					}
				} else {
					for (I = 0, F = J.length; I < F; I++) {
						H = J[I];
						if (typeof H == "string" && (" " + K.dom.className + " ").indexOf(" " + H + " ") == -1) {
							G.push(H)
						}
					}
					if (G.length) {
						K.dom.className += " " + G.join(" ")
					}
				}
				return K
			},
			removeClass : function (K) {
				var L = this,
				J,
				G,
				F,
				I,
				H;
				if (!Ext.isArray(K)) {
					K = [K]
				}
				if (L.dom && L.dom.className) {
					H = L.dom.className.replace(l, "").split(u);
					for (J = 0, F = K.length; J < F; J++) {
						I = K[J];
						if (typeof I == "string") {
							I = I.replace(l, "");
							G = H.indexOf(I);
							if (G != -1) {
								H.splice(G, 1)
							}
						}
					}
					L.dom.className = H.join(" ")
				}
				return L
			},
			radioClass : function (I) {
				var J = this.dom.parentNode.childNodes,
				G,
				H,
				F;
				I = Ext.isArray(I) ? I : [I];
				for (H = 0, F = J.length; H < F; H++) {
					G = J[H];
					if (G && G.nodeType == 1) {
						Ext.fly(G, "_internal").removeClass(I)
					}
				}
				return this.addClass(I)
			},
			toggleClass : function (F) {
				return this.hasClass(F) ? this.removeClass(F) : this.addClass(F)
			},
			hasClass : function (F) {
				return F && (" " + this.dom.className + " ").indexOf(" " + F + " ") != -1
			},
			replaceClass : function (G, F) {
				return this.removeClass(G).addClass(F)
			},
			isStyle : function (F, G) {
				return this.getStyle(F) == G
			},
			getStyle : function () {
				return s && s.getComputedStyle ? function (K) {
					var I = this.dom,
					F,
					H,
					G,
					J;
					if (I == document) {
						return null
					}
					K = v(K);
					G = (F = I.style[K]) ? F : (H = s.getComputedStyle(I, "")) ? H[K] : null;
					if (K == "marginRight" && G != "0px" && !A.correctRightMargin) {
						J = I.style.display;
						I.style.display = "inline-block";
						G = s.getComputedStyle(I, "").marginRight;
						I.style.display = J
					}
					if (K == "backgroundColor" && G == "rgba(0, 0, 0, 0)" && !A.correctTransparentColor) {
						G = "transparent"
					}
					return G
				}
				 : function (J) {
					var H = this.dom,
					F,
					G;
					if (H == document) {
						return null
					}
					if (J == "opacity") {
						if (H.style.filter.match) {
							if (F = H.style.filter.match(D)) {
								var I = parseFloat(F[1]);
								if (!isNaN(I)) {
									return I ? I / 100 : 0
								}
							}
						}
						return 1
					}
					J = v(J);
					return H.style[J] || ((G = H.currentStyle) ? G[J] : null)
				}
			}
			(),
			getColor : function (F, G, K) {
				var I = this.getStyle(F),
				H = (typeof K != "undefined") ? K : "#",
				J;
				if (!I || (/transparent|inherit/.test(I))) {
					return G
				}
				if (/^r/.test(I)) {
					Ext.each(I.slice(4, I.length - 1).split(","), function (L) {
							J = parseInt(L, 10);
							H += (J < 16 ? "0" : "") + J.toString(16)
						})
				} else {
					I = I.replace("#", "");
					H += I.length == 3 ? I.replace(/^(\w)(\w)(\w)$/, "$1$1$2$2$3$3") : I
				}
				return (H.length > 5 ? H.toLowerCase() : G)
			},
			setStyle : function (I, H) {
				var F,
				G;
				if (typeof I != "object") {
					F = {};
					F[I] = H;
					I = F
				}
				for (G in I) {
					H = I[G];
					G == "opacity" ? this.setOpacity(H) : this.dom.style[v(G)] = H
				}
				return this
			},
			setOpacity : function (G, F) {
				var J = this,
				H = J.dom.style;
				if (!F || !J.anim) {
					if (Ext.isIE) {
						var I = G < 1 ? "alpha(opacity=" + G * 100 + ")" : "",
						K = H.filter.replace(D, "").replace(l, "");
						H.zoom = 1;
						H.filter = K + (K.length > 0 ? " " : "") + I
					} else {
						H.opacity = G
					}
				} else {
					J.anim({
							opacity : {
								to : G
							}
						}, J.preanim(arguments, 1), null, 0.35, "easeIn")
				}
				return J
			},
			clearOpacity : function () {
				var F = this.dom.style;
				if (Ext.isIE) {
					if (!Ext.isEmpty(F.filter)) {
						F.filter = F.filter.replace(D, "").replace(l, "")
					}
				} else {
					F.opacity = F["-moz-opacity"] = F["-khtml-opacity"] = ""
				}
				return this
			},
			getHeight : function (H) {
				var G = this,
				J = G.dom,
				I = Ext.isIE && G.isStyle("display", "none"),
				F = r.max(J.offsetHeight, I ? 0 : J.clientHeight) || 0;
				F = !H ? F : F - G.getBorderWidth("tb") - G.getPadding("tb");
				return F < 0 ? 0 : F
			},
			getWidth : function (G) {
				var H = this,
				J = H.dom,
				I = Ext.isIE && H.isStyle("display", "none"),
				F = r.max(J.offsetWidth, I ? 0 : J.clientWidth) || 0;
				F = !G ? F : F - H.getBorderWidth("lr") - H.getPadding("lr");
				return F < 0 ? 0 : F
			},
			setWidth : function (G, F) {
				var H = this;
				G = H.adjustWidth(G);
				!F || !H.anim ? H.dom.style.width = H.addUnits(G) : H.anim({
							width : {
								to : G
							}
						}, H.preanim(arguments, 1));
				return H
			},
			setHeight : function (F, G) {
				var H = this;
				F = H.adjustHeight(F);
				!G || !H.anim ? H.dom.style.height = H.addUnits(F) : H.anim({
							height : {
								to : F
							}
						}, H.preanim(arguments, 1));
				return H
			},
			getBorderWidth : function (F) {
				return this.addStyles(F, i)
			},
			getPadding : function (F) {
				return this.addStyles(F, g)
			},
			clip : function () {
				var F = this,
				G = F.dom;
				if (!E(G, e)) {
					E(G, e, true);
					E(G, C, {
							o : F.getStyle(k),
							x : F.getStyle(n),
							y : F.getStyle(m)
						});
					F.setStyle(k, z);
					F.setStyle(n, z);
					F.setStyle(m, z)
				}
				return F
			},
			unclip : function () {
				var F = this,
				H = F.dom;
				if (E(H, e)) {
					E(H, e, false);
					var G = E(H, C);
					if (G.o) {
						F.setStyle(k, G.o)
					}
					if (G.x) {
						F.setStyle(n, G.x)
					}
					if (G.y) {
						F.setStyle(m, G.y)
					}
				}
				return F
			},
			addStyles : function (M, L) {
				var J = 0,
				K = M.match(b),
				I,
				H,
				G,
				F = K.length;
				for (G = 0; G < F; G++) {
					I = K[G];
					H = I && parseInt(this.getStyle(L[I]), 10);
					if (H) {
						J += r.abs(H)
					}
				}
				return J
			},
			margins : a
		}
	}
	());
(function () {
		var a = Ext.lib.Dom,
		b = "left",
		g = "right",
		d = "top",
		i = "bottom",
		h = "position",
		c = "static",
		e = "relative",
		j = "auto",
		k = "z-index";
		Ext.Element.addMethods({
				getX : function () {
					return a.getX(this.dom)
				},
				getY : function () {
					return a.getY(this.dom)
				},
				getXY : function () {
					return a.getXY(this.dom)
				},
				getOffsetsTo : function (l) {
					var n = this.getXY(),
					m = Ext.fly(l, "_internal").getXY();
					return [n[0] - m[0], n[1] - m[1]]
				},
				setX : function (l, m) {
					return this.setXY([l, this.getY()], this.animTest(arguments, m, 1))
				},
				setY : function (m, l) {
					return this.setXY([this.getX(), m], this.animTest(arguments, l, 1))
				},
				setLeft : function (l) {
					this.setStyle(b, this.addUnits(l));
					return this
				},
				setTop : function (l) {
					this.setStyle(d, this.addUnits(l));
					return this
				},
				setRight : function (l) {
					this.setStyle(g, this.addUnits(l));
					return this
				},
				setBottom : function (l) {
					this.setStyle(i, this.addUnits(l));
					return this
				},
				setXY : function (n, l) {
					var m = this;
					if (!l || !m.anim) {
						a.setXY(m.dom, n)
					} else {
						m.anim({
								points : {
									to : n
								}
							}, m.preanim(arguments, 1), "motion")
					}
					return m
				},
				setLocation : function (l, n, m) {
					return this.setXY([l, n], this.animTest(arguments, m, 2))
				},
				moveTo : function (l, n, m) {
					return this.setXY([l, n], this.animTest(arguments, m, 2))
				},
				getLeft : function (l) {
					return !l ? this.getX() : parseInt(this.getStyle(b), 10) || 0
				},
				getRight : function (l) {
					var m = this;
					return !l ? m.getX() + m.getWidth() : (m.getLeft(true) + m.getWidth()) || 0
				},
				getTop : function (l) {
					return !l ? this.getY() : parseInt(this.getStyle(d), 10) || 0
				},
				getBottom : function (l) {
					var m = this;
					return !l ? m.getY() + m.getHeight() : (m.getTop(true) + m.getHeight()) || 0
				},
				position : function (p, o, l, n) {
					var m = this;
					if (!p && m.isStyle(h, c)) {
						m.setStyle(h, e)
					} else {
						if (p) {
							m.setStyle(h, p)
						}
					}
					if (o) {
						m.setStyle(k, o)
					}
					if (l || n) {
						m.setXY([l || false, n || false])
					}
				},
				clearPositioning : function (l) {
					l = l || "";
					this.setStyle({
							left : l,
							right : l,
							top : l,
							bottom : l,
							"z-index" : "",
							position : c
						});
					return this
				},
				getPositioning : function () {
					var m = this.getStyle(b);
					var n = this.getStyle(d);
					return {
						position : this.getStyle(h),
						left : m,
						right : m ? "" : this.getStyle(g),
						top : n,
						bottom : n ? "" : this.getStyle(i),
						"z-index" : this.getStyle(k)
					}
				},
				setPositioning : function (l) {
					var n = this,
					m = n.dom.style;
					n.setStyle(l);
					if (l.right == j) {
						m.right = ""
					}
					if (l.bottom == j) {
						m.bottom = ""
					}
					return n
				},
				translatePoints : function (m, u) {
					u = isNaN(m[1]) ? u : m[1];
					m = isNaN(m[0]) ? m : m[0];
					var q = this,
					r = q.isStyle(h, e),
					s = q.getXY(),
					n = parseInt(q.getStyle(b), 10),
					p = parseInt(q.getStyle(d), 10);
					n = !isNaN(n) ? n : (r ? 0 : q.dom.offsetLeft);
					p = !isNaN(p) ? p : (r ? 0 : q.dom.offsetTop);
					return {
						left : (m - s[0] + n),
						top : (u - s[1] + p)
					}
				},
				animTest : function (m, l, n) {
					return !!l && this.preanim ? this.preanim(m, n) : false
				}
			})
	})();
Ext.Element.addMethods({
		isScrollable : function () {
			var a = this.dom;
			return a.scrollHeight > a.clientHeight || a.scrollWidth > a.clientWidth
		},
		scrollTo : function (a, b) {
			this.dom["scroll" + (/top/i.test(a) ? "Top" : "Left")] = b;
			return this
		},
		getScroll : function () {
			var i = this.dom,
			h = document,
			a = h.body,
			c = h.documentElement,
			b,
			g,
			e;
			if (i == h || i == a) {
				if (Ext.isIE && Ext.isStrict) {
					b = c.scrollLeft;
					g = c.scrollTop
				} else {
					b = window.pageXOffset;
					g = window.pageYOffset
				}
				e = {
					left : b || (a ? a.scrollLeft : 0),
					top : g || (a ? a.scrollTop : 0)
				}
			} else {
				e = {
					left : i.scrollLeft,
					top : i.scrollTop
				}
			}
			return e
		}
	});
Ext.Element.VISIBILITY = 1;
Ext.Element.DISPLAY = 2;
Ext.Element.OFFSETS = 3;
Ext.Element.ASCLASS = 4;
Ext.Element.visibilityCls = "x-hide-nosize";
Ext.Element.addMethods(function () {
		var e = Ext.Element,
		p = "opacity",
		j = "visibility",
		g = "display",
		d = "hidden",
		n = "offsets",
		k = "asclass",
		m = "none",
		a = "nosize",
		b = "originalDisplay",
		c = "visibilityMode",
		h = "isVisible",
		i = e.data,
		l = function (r) {
			var q = i(r, b);
			if (q === undefined) {
				i(r, b, q = "")
			}
			return q
		},
		o = function (r) {
			var q = i(r, c);
			if (q === undefined) {
				i(r, c, q = 1)
			}
			return q
		};
		return {
			originalDisplay : "",
			visibilityMode : 1,
			setVisibilityMode : function (q) {
				i(this.dom, c, q);
				return this
			},
			animate : function (r, t, s, u, q) {
				this.anim(r, {
						duration : t,
						callback : s,
						easing : u
					}, q);
				return this
			},
			anim : function (t, u, r, w, s, q) {
				r = r || "run";
				u = u || {};
				var v = this,
				x = Ext.lib.Anim[r](v.dom, t, (u.duration || w) || 0.35, (u.easing || s) || "easeOut", function () {
							if (q) {
								q.call(v)
							}
							if (u.callback) {
								u.callback.call(u.scope || v, v, u)
							}
						}, v);
				u.anim = x;
				return x
			},
			preanim : function (q, r) {
				return !q[r] ? false : (typeof q[r] == "object" ? q[r] : {
						duration : q[r + 1],
						callback : q[r + 2],
						easing : q[r + 3]
					})
			},
			isVisible : function () {
				var q = this,
				s = q.dom,
				r = i(s, h);
				if (typeof r == "boolean") {
					return r
				}
				r = !q.isStyle(j, d) && !q.isStyle(g, m) && !((o(s) == e.ASCLASS) && q.hasClass(q.visibilityCls || e.visibilityCls));
				i(s, h, r);
				return r
			},
			setVisible : function (t, q) {
				var w = this,
				r,
				y,
				x,
				v,
				u = w.dom,
				s = o(u);
				if (typeof q == "string") {
					switch (q) {
					case g:
						s = e.DISPLAY;
						break;
					case j:
						s = e.VISIBILITY;
						break;
					case n:
						s = e.OFFSETS;
						break;
					case a:
					case k:
						s = e.ASCLASS;
						break
					}
					w.setVisibilityMode(s);
					q = false
				}
				if (!q || !w.anim) {
					if (s == e.ASCLASS) {
						w[t ? "removeClass" : "addClass"](w.visibilityCls || e.visibilityCls)
					} else {
						if (s == e.DISPLAY) {
							return w.setDisplayed(t)
						} else {
							if (s == e.OFFSETS) {
								if (!t) {
									w.hideModeStyles = {
										position : w.getStyle("position"),
										top : w.getStyle("top"),
										left : w.getStyle("left")
									};
									w.applyStyles({
											position : "absolute",
											top : "-10000px",
											left : "-10000px"
										})
								} else {
									w.applyStyles(w.hideModeStyles || {
											position : "",
											top : "",
											left : ""
										});
									delete w.hideModeStyles
								}
							} else {
								w.fixDisplay();
								u.style.visibility = t ? "visible" : d
							}
						}
					}
				} else {
					if (t) {
						w.setOpacity(0.01);
						w.setVisible(true)
					}
					w.anim({
							opacity : {
								to : (t ? 1 : 0)
							}
						}, w.preanim(arguments, 1), null, 0.35, "easeIn", function () {
							t || w.setVisible(false).setOpacity(1)
						})
				}
				i(u, h, t);
				return w
			},
			hasMetrics : function () {
				var q = this.dom;
				return this.isVisible() || (o(q) == e.VISIBILITY)
			},
			toggle : function (q) {
				var r = this;
				r.setVisible(!r.isVisible(), r.preanim(arguments, 0));
				return r
			},
			setDisplayed : function (q) {
				if (typeof q == "boolean") {
					q = q ? l(this.dom) : m
				}
				this.setStyle(g, q);
				return this
			},
			fixDisplay : function () {
				var q = this;
				if (q.isStyle(g, m)) {
					q.setStyle(j, d);
					q.setStyle(g, l(this.dom));
					if (q.isStyle(g, m)) {
						q.setStyle(g, "block")
					}
				}
			},
			hide : function (q) {
				if (typeof q == "string") {
					this.setVisible(false, q);
					return this
				}
				this.setVisible(false, this.preanim(arguments, 0));
				return this
			},
			show : function (q) {
				if (typeof q == "string") {
					this.setVisible(true, q);
					return this
				}
				this.setVisible(true, this.preanim(arguments, 0));
				return this
			}
		}
	}
	());
(function () {
		var y = null,
		A = undefined,
		k = true,
		t = false,
		j = "setX",
		h = "setY",
		a = "setXY",
		n = "left",
		l = "bottom",
		s = "top",
		m = "right",
		q = "height",
		g = "width",
		i = "points",
		w = "hidden",
		z = "absolute",
		u = "visible",
		e = "motion",
		o = "position",
		r = "easeOut",
		d = new Ext.Element.Flyweight(),
		v = {},
		x = function (B) {
			return B || {}
			
		},
		p = function (B) {
			d.dom = B;
			d.id = Ext.id(B);
			return d
		},
		c = function (B) {
			if (!v[B]) {
				v[B] = []
			}
			return v[B]
		},
		b = function (C, B) {
			v[C] = B
		};
		Ext.enableFx = k;
		Ext.Fx = {
			switchStatements : function (C, D, B) {
				return D.apply(this, B[C])
			},
			slideIn : function (H, E) {
				E = x(E);
				var J = this,
				G = J.dom,
				M = G.style,
				O,
				B,
				L,
				D,
				C,
				M,
				I,
				N,
				K,
				F;
				H = H || "t";
				J.queueFx(E, function () {
						O = p(G).getXY();
						p(G).fixDisplay();
						B = p(G).getFxRestore();
						L = {
							x : O[0],
							y : O[1],
							0 : O[0],
							1 : O[1],
							width : G.offsetWidth,
							height : G.offsetHeight
						};
						L.right = L.x + L.width;
						L.bottom = L.y + L.height;
						p(G).setWidth(L.width).setHeight(L.height);
						D = p(G).fxWrap(B.pos, E, w);
						M.visibility = u;
						M.position = z;
						function P() {
							p(G).fxUnwrap(D, B.pos, E);
							M.width = B.width;
							M.height = B.height;
							p(G).afterFx(E)
						}
						N = {
							to : [L.x, L.y]
						};
						K = {
							to : L.width
						};
						F = {
							to : L.height
						};
						function Q(U, R, V, S, X, Z, ac, ab, aa, W, T) {
							var Y = {};
							p(U).setWidth(V).setHeight(S);
							if (p(U)[X]) {
								p(U)[X](Z)
							}
							R[ac] = R[ab] = "0";
							if (aa) {
								Y.width = aa
							}
							if (W) {
								Y.height = W
							}
							if (T) {
								Y.points = T
							}
							return Y
						}
						I = p(G).switchStatements(H.toLowerCase(), Q, {
									t : [D, M, L.width, 0, y, y, n, l, y, F, y],
									l : [D, M, 0, L.height, y, y, m, s, K, y, y],
									r : [D, M, L.width, L.height, j, L.right, n, s, y, y, N],
									b : [D, M, L.width, L.height, h, L.bottom, n, s, y, F, N],
									tl : [D, M, 0, 0, y, y, m, l, K, F, N],
									bl : [D, M, 0, 0, h, L.y + L.height, m, s, K, F, N],
									br : [D, M, 0, 0, a, [L.right, L.bottom], n, s, K, F, N],
									tr : [D, M, 0, 0, j, L.x + L.width, n, l, K, F, N]
								});
						M.visibility = u;
						p(D).show();
						arguments.callee.anim = p(D).fxanim(I, E, e, 0.5, r, P)
					});
				return J
			},
			slideOut : function (F, D) {
				D = x(D);
				var H = this,
				E = H.dom,
				K = E.style,
				L = H.getXY(),
				C,
				B,
				I,
				J,
				G = {
					to : 0
				};
				F = F || "t";
				H.queueFx(D, function () {
						B = p(E).getFxRestore();
						I = {
							x : L[0],
							y : L[1],
							0 : L[0],
							1 : L[1],
							width : E.offsetWidth,
							height : E.offsetHeight
						};
						I.right = I.x + I.width;
						I.bottom = I.y + I.height;
						p(E).setWidth(I.width).setHeight(I.height);
						C = p(E).fxWrap(B.pos, D, u);
						K.visibility = u;
						K.position = z;
						p(C).setWidth(I.width).setHeight(I.height);
						function M() {
							D.useDisplay ? p(E).setDisplayed(t) : p(E).hide();
							p(E).fxUnwrap(C, B.pos, D);
							K.width = B.width;
							K.height = B.height;
							p(E).afterFx(D)
						}
						function N(O, W, U, X, S, V, R, T, Q) {
							var P = {};
							O[W] = O[U] = "0";
							P[X] = S;
							if (V) {
								P[V] = R
							}
							if (T) {
								P[T] = Q
							}
							return P
						}
						J = p(E).switchStatements(F.toLowerCase(), N, {
									t : [K, n, l, q, G],
									l : [K, m, s, g, G],
									r : [K, n, s, g, G, i, {
											to : [I.right, I.y]
										}
									],
									b : [K, n, s, q, G, i, {
											to : [I.x, I.bottom]
										}
									],
									tl : [K, m, l, g, G, q, G],
									bl : [K, m, s, g, G, q, G, i, {
											to : [I.x, I.bottom]
										}
									],
									br : [K, n, s, g, G, q, G, i, {
											to : [I.x + I.width, I.bottom]
										}
									],
									tr : [K, n, l, g, G, q, G, i, {
											to : [I.right, I.y]
										}
									]
								});
						arguments.callee.anim = p(C).fxanim(J, D, e, 0.5, r, M)
					});
				return H
			},
			puff : function (H) {
				H = x(H);
				var F = this,
				G = F.dom,
				C = G.style,
				D,
				B,
				E;
				F.queueFx(H, function () {
						D = p(G).getWidth();
						B = p(G).getHeight();
						p(G).clearOpacity();
						p(G).show();
						E = p(G).getFxRestore();
						function I() {
							H.useDisplay ? p(G).setDisplayed(t) : p(G).hide();
							p(G).clearOpacity();
							p(G).setPositioning(E.pos);
							C.width = E.width;
							C.height = E.height;
							C.fontSize = "";
							p(G).afterFx(H)
						}
						arguments.callee.anim = p(G).fxanim({
									width : {
										to : p(G).adjustWidth(D * 2)
									},
									height : {
										to : p(G).adjustHeight(B * 2)
									},
									points : {
										by : [-D * 0.5, -B * 0.5]
									},
									opacity : {
										to : 0
									},
									fontSize : {
										to : 200,
										unit : "%"
									}
								}, H, e, 0.5, r, I)
					});
				return F
			},
			switchOff : function (F) {
				F = x(F);
				var D = this,
				E = D.dom,
				B = E.style,
				C;
				D.queueFx(F, function () {
						p(E).clearOpacity();
						p(E).clip();
						C = p(E).getFxRestore();
						function G() {
							F.useDisplay ? p(E).setDisplayed(t) : p(E).hide();
							p(E).clearOpacity();
							p(E).setPositioning(C.pos);
							B.width = C.width;
							B.height = C.height;
							p(E).afterFx(F)
						}
						p(E).fxanim({
								opacity : {
									to : 0.3
								}
							}, y, y, 0.1, y, function () {
								p(E).clearOpacity();
								(function () {
										p(E).fxanim({
												height : {
													to : 1
												},
												points : {
													by : [0, p(E).getHeight() * 0.5]
												}
											}, F, e, 0.3, "easeIn", G)
									}).defer(100)
							})
					});
				return D
			},
			highlight : function (D, H) {
				H = x(H);
				var F = this,
				G = F.dom,
				B = H.attr || "backgroundColor",
				C = {},
				E;
				F.queueFx(H, function () {
						p(G).clearOpacity();
						p(G).show();
						function I() {
							G.style[B] = E;
							p(G).afterFx(H)
						}
						E = G.style[B];
						C[B] = {
							from : D || "ffff9c",
							to : H.endColor || p(G).getColor(B) || "ffffff"
						};
						arguments.callee.anim = p(G).fxanim(C, H, "color", 1, "easeIn", I)
					});
				return F
			},
			frame : function (B, E, H) {
				H = x(H);
				var D = this,
				G = D.dom,
				C,
				F;
				D.queueFx(H, function () {
						B = B || "#C3DAF9";
						if (B.length == 6) {
							B = "#" + B
						}
						E = E || 1;
						p(G).show();
						var L = p(G).getXY(),
						J = {
							x : L[0],
							y : L[1],
							0 : L[0],
							1 : L[1],
							width : G.offsetWidth,
							height : G.offsetHeight
						},
						I = function () {
							C = p(document.body || document.documentElement).createChild({
										style : {
											position : z,
											"z-index" : 35000,
											border : "0px solid " + B
										}
									});
							return C.queueFx({}, K)
						};
						arguments.callee.anim = {
							isAnimated : true,
							stop : function () {
								E = 0;
								C.stopFx()
							}
						};
						function K() {
							var M = Ext.isBorderBox ? 2 : 1;
							F = C.anim({
										top : {
											from : J.y,
											to : J.y - 20
										},
										left : {
											from : J.x,
											to : J.x - 20
										},
										borderWidth : {
											from : 0,
											to : 10
										},
										opacity : {
											from : 1,
											to : 0
										},
										height : {
											from : J.height,
											to : J.height + 20 * M
										},
										width : {
											from : J.width,
											to : J.width + 20 * M
										}
									}, {
										duration : H.duration || 1,
										callback : function () {
											C.remove();
											--E > 0 ? I() : p(G).afterFx(H)
										}
									});
							arguments.callee.anim = {
								isAnimated : true,
								stop : function () {
									F.stop()
								}
							}
						}
						I()
					});
				return D
			},
			pause : function (D) {
				var C = this.dom,
				B;
				this.queueFx({}, function () {
						B = setTimeout(function () {
									p(C).afterFx({})
								}, D * 1000);
						arguments.callee.anim = {
							isAnimated : true,
							stop : function () {
								clearTimeout(B);
								p(C).afterFx({})
							}
						}
					});
				return this
			},
			fadeIn : function (D) {
				D = x(D);
				var B = this,
				C = B.dom,
				E = D.endOpacity || 1;
				B.queueFx(D, function () {
						p(C).setOpacity(0);
						p(C).fixDisplay();
						C.style.visibility = u;
						arguments.callee.anim = p(C).fxanim({
									opacity : {
										to : E
									}
								}, D, y, 0.5, r, function () {
									if (E == 1) {
										p(C).clearOpacity()
									}
									p(C).afterFx(D)
								})
					});
				return B
			},
			fadeOut : function (E) {
				E = x(E);
				var C = this,
				D = C.dom,
				B = D.style,
				F = E.endOpacity || 0;
				C.queueFx(E, function () {
						arguments.callee.anim = p(D).fxanim({
									opacity : {
										to : F
									}
								}, E, y, 0.5, r, function () {
									if (F == 0) {
										Ext.Element.data(D, "visibilityMode") == Ext.Element.DISPLAY || E.useDisplay ? B.display = "none" : B.visibility = w;
										p(D).clearOpacity()
									}
									p(D).afterFx(E)
								})
					});
				return C
			},
			scale : function (B, C, D) {
				this.shift(Ext.apply({}, D, {
							width : B,
							height : C
						}));
				return this
			},
			shift : function (D) {
				D = x(D);
				var C = this.dom,
				B = {};
				this.queueFx(D, function () {
						for (var E in D) {
							if (D[E] != A) {
								B[E] = {
									to : D[E]
								}
							}
						}
						B.width ? B.width.to = p(C).adjustWidth(D.width) : B;
						B.height ? B.height.to = p(C).adjustWidth(D.height) : B;
						if (B.x || B.y || B.xy) {
							B.points = B.xy || {
									to : [B.x ? B.x.to : p(C).getX(), B.y ? B.y.to : p(C).getY()]
								}
						}
						arguments.callee.anim = p(C).fxanim(B, D, e, 0.35, r, function () {
									p(C).afterFx(D)
								})
					});
				return this
			},
			ghost : function (E, C) {
				C = x(C);
				var G = this,
				D = G.dom,
				J = D.style,
				H = {
					opacity : {
						to : 0
					},
					points : {}
					
				},
				K = H.points,
				B,
				I,
				F;
				E = E || "b";
				G.queueFx(C, function () {
						B = p(D).getFxRestore();
						I = p(D).getWidth();
						F = p(D).getHeight();
						function L() {
							C.useDisplay ? p(D).setDisplayed(t) : p(D).hide();
							p(D).clearOpacity();
							p(D).setPositioning(B.pos);
							J.width = B.width;
							J.height = B.height;
							p(D).afterFx(C)
						}
						K.by = p(D).switchStatements(E.toLowerCase(), function (N, M) {
									return [N, M]
								}, {
									t : [0, -F],
									l : [-I, 0],
									r : [I, 0],
									b : [0, F],
									tl : [-I, -F],
									bl : [-I, F],
									br : [I, F],
									tr : [I, -F]
								});
						arguments.callee.anim = p(D).fxanim(H, C, e, 0.5, r, L)
					});
				return G
			},
			syncFx : function () {
				var B = this;
				B.fxDefaults = Ext.apply(B.fxDefaults || {}, {
							block : t,
							concurrent : k,
							stopFx : t
						});
				return B
			},
			sequenceFx : function () {
				var B = this;
				B.fxDefaults = Ext.apply(B.fxDefaults || {}, {
							block : t,
							concurrent : t,
							stopFx : t
						});
				return B
			},
			nextFx : function () {
				var B = c(this.dom.id)[0];
				if (B) {
					B.call(this)
				}
			},
			hasActiveFx : function () {
				return c(this.dom.id)[0]
			},
			stopFx : function (B) {
				var C = this,
				E = C.dom.id;
				if (C.hasActiveFx()) {
					var D = c(E)[0];
					if (D && D.anim) {
						if (D.anim.isAnimated) {
							b(E, [D]);
							D.anim.stop(B !== undefined ? B : k)
						} else {
							b(E, [])
						}
					}
				}
				return C
			},
			beforeFx : function (B) {
				if (this.hasActiveFx() && !B.concurrent) {
					if (B.stopFx) {
						this.stopFx();
						return k
					}
					return t
				}
				return k
			},
			hasFxBlock : function () {
				var B = c(this.dom.id);
				return B && B[0] && B[0].block
			},
			queueFx : function (E, B) {
				var C = p(this.dom);
				if (!C.hasFxBlock()) {
					Ext.applyIf(E, C.fxDefaults);
					if (!E.concurrent) {
						var D = C.beforeFx(E);
						B.block = E.block;
						c(C.dom.id).push(B);
						if (D) {
							C.nextFx()
						}
					} else {
						B.call(C)
					}
				}
				return C
			},
			fxWrap : function (H, F, D) {
				var E = this.dom,
				C,
				B;
				if (!F.wrap || !(C = Ext.getDom(F.wrap))) {
					if (F.fixPosition) {
						B = p(E).getXY()
					}
					var G = document.createElement("div");
					G.style.visibility = D;
					C = E.parentNode.insertBefore(G, E);
					p(C).setPositioning(H);
					if (p(C).isStyle(o, "static")) {
						p(C).position("relative")
					}
					p(E).clearPositioning("auto");
					p(C).clip();
					C.appendChild(E);
					if (B) {
						p(C).setXY(B)
					}
				}
				return C
			},
			fxUnwrap : function (C, F, E) {
				var D = this.dom;
				p(D).clearPositioning();
				p(D).setPositioning(F);
				if (!E.wrap) {
					var B = p(C).dom.parentNode;
					B.insertBefore(D, C);
					p(C).remove()
				}
			},
			getFxRestore : function () {
				var B = this.dom.style;
				return {
					pos : this.getPositioning(),
					width : B.width,
					height : B.height
				}
			},
			afterFx : function (C) {
				var B = this.dom,
				D = B.id;
				if (C.afterStyle) {
					p(B).setStyle(C.afterStyle)
				}
				if (C.afterCls) {
					p(B).addClass(C.afterCls)
				}
				if (C.remove == k) {
					p(B).remove()
				}
				if (C.callback) {
					C.callback.call(C.scope, p(B))
				}
				if (!C.concurrent) {
					c(D).shift();
					p(B).nextFx()
				}
			},
			fxanim : function (E, F, C, G, D, B) {
				C = C || "run";
				F = F || {};
				var H = Ext.lib.Anim[C](this.dom, E, (F.duration || G) || 0.35, (F.easing || D) || r, B, this);
				F.anim = H;
				return H
			}
		};
		Ext.Fx.resize = Ext.Fx.scale;
		Ext.Element.addMethods(Ext.Fx)
	})();
Ext.CompositeElementLite = function (b, a) {
	this.elements = [];
	this.add(b, a);
	this.el = new Ext.Element.Flyweight()
};
Ext.CompositeElementLite.prototype = {
	isComposite : true,
	getElement : function (a) {
		var b = this.el;
		b.dom = a;
		b.id = a.id;
		return b
	},
	transformElement : function (a) {
		return Ext.getDom(a)
	},
	getCount : function () {
		return this.elements.length
	},
	add : function (d, b) {
		var e = this,
		g = e.elements;
		if (!d) {
			return this
		}
		if (typeof d == "string") {
			d = Ext.Element.selectorFunction(d, b)
		} else {
			if (d.isComposite) {
				d = d.elements
			} else {
				if (!Ext.isIterable(d)) {
					d = [d]
				}
			}
		}
		for (var c = 0, a = d.length; c < a; ++c) {
			g.push(e.transformElement(d[c]))
		}
		return e
	},
	invoke : function (g, b) {
		var h = this,
		d = h.elements,
		a = d.length,
		j,
		c;
		for (c = 0; c < a; c++) {
			j = d[c];
			if (j) {
				Ext.Element.prototype[g].apply(h.getElement(j), b)
			}
		}
		return h
	},
	item : function (b) {
		var d = this,
		c = d.elements[b],
		a = null;
		if (c) {
			a = d.getElement(c)
		}
		return a
	},
	addListener : function (b, j, h, g) {
		var d = this.elements,
		a = d.length,
		c,
		k;
		for (c = 0; c < a; c++) {
			k = d[c];
			if (k) {
				Ext.EventManager.on(k, b, j, h || k, g)
			}
		}
		return this
	},
	each : function (g, d) {
		var h = this,
		c = h.elements,
		a = c.length,
		b,
		j;
		for (b = 0; b < a; b++) {
			j = c[b];
			if (j) {
				j = this.getElement(j);
				if (g.call(d || j, j, h, b) === false) {
					break
				}
			}
		}
		return h
	},
	fill : function (a) {
		var b = this;
		b.elements = [];
		b.add(a);
		return b
	},
	filter : function (a) {
		var b = [],
		d = this,
		c = Ext.isFunction(a) ? a : function (e) {
			return e.is(a)
		};
		d.each(function (h, e, g) {
				if (c(h, g) !== false) {
					b[b.length] = d.transformElement(h)
				}
			});
		d.elements = b;
		return d
	},
	indexOf : function (a) {
		return this.elements.indexOf(this.transformElement(a))
	},
	replaceElement : function (e, c, a) {
		var b = !isNaN(e) ? e : this.indexOf(e),
		g;
		if (b > -1) {
			c = Ext.getDom(c);
			if (a) {
				g = this.elements[b];
				g.parentNode.insertBefore(c, g);
				Ext.removeNode(g)
			}
			this.elements.splice(b, 1, c)
		}
		return this
	},
	clear : function () {
		this.elements = []
	}
};
Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener;
Ext.CompositeElementLite.importElementMethods = function () {
	var c,
	b = Ext.Element.prototype,
	a = Ext.CompositeElementLite.prototype;
	for (c in b) {
		if (typeof b[c] == "function") {
			(function (d) {
					a[d] = a[d] || function () {
						return this.invoke(d, arguments)
					}
				}).call(a, c)
		}
	}
};
Ext.CompositeElementLite.importElementMethods();
if (Ext.DomQuery) {
	Ext.Element.selectorFunction = Ext.DomQuery.select
}
Ext.Element.select = function (a, b) {
	var c;
	if (typeof a == "string") {
		c = Ext.Element.selectorFunction(a, b)
	} else {
		if (a.length !== undefined) {
			c = a
		} else {
			throw "Invalid selector"
		}
	}
	return new Ext.CompositeElementLite(c)
};
Ext.select = Ext.Element.select;
(function () {
		var b = "beforerequest",
		e = "requestcomplete",
		d = "requestexception",
		h = undefined,
		c = "load",
		i = "POST",
		a = "GET",
		g = window;
		Ext.data.Connection = function (j) {
			Ext.apply(this, j);
			this.addEvents(b, e, d);
			Ext.data.Connection.superclass.constructor.call(this)
		};
		Ext.extend(Ext.data.Connection, Ext.util.Observable, {
				timeout : 30000,
				autoAbort : false,
				disableCaching : true,
				disableCachingParam : "_dc",
				request : function (n) {
					var s = this;
					if (s.fireEvent(b, s, n)) {
						if (n.el) {
							if (!Ext.isEmpty(n.indicatorText)) {
								s.indicatorText = '<div class="loading-indicator">' + n.indicatorText + "</div>"
							}
							if (s.indicatorText) {
								Ext.getDom(n.el).innerHTML = s.indicatorText
							}
							n.success = (Ext.isFunction(n.success) ? n.success : function () {}).createInterceptor(function (o) {
									Ext.getDom(n.el).innerHTML = o.responseText
								})
						}
						var l = n.params,
						k = n.url || s.url,
						j,
						q = {
							success : s.handleResponse,
							failure : s.handleFailure,
							scope : s,
							argument : {
								options : n
							},
							timeout : Ext.num(n.timeout, s.timeout)
						},
						m,
						t;
						if (Ext.isFunction(l)) {
							l = l.call(n.scope || g, n)
						}
						l = Ext.urlEncode(s.extraParams, Ext.isObject(l) ? Ext.urlEncode(l) : l);
						if (Ext.isFunction(k)) {
							k = k.call(n.scope || g, n)
						}
						if ((m = Ext.getDom(n.form))) {
							k = k || m.action;
							if (n.isUpload || (/multipart\/form-data/i.test(m.getAttribute("enctype")))) {
								return s.doFormUpload.call(s, n, l, k)
							}
							t = Ext.lib.Ajax.serializeForm(m);
							l = l ? (l + "&" + t) : t
						}
						j = n.method || s.method || ((l || n.xmlData || n.jsonData) ? i : a);
						if (j === a && (s.disableCaching && n.disableCaching !== false) || n.disableCaching === true) {
							var r = n.disableCachingParam || s.disableCachingParam;
							k = Ext.urlAppend(k, r + "=" + (new Date().getTime()))
						}
						n.headers = Ext.applyIf(n.headers || {}, s.defaultHeaders || {});
						if (n.autoAbort === true || s.autoAbort) {
							s.abort()
						}
						if ((j == a || n.xmlData || n.jsonData) && l) {
							k = Ext.urlAppend(k, l);
							l = ""
						}
						return (s.transId = Ext.lib.Ajax.request(j, k, q, l, n))
					} else {
						return n.callback ? n.callback.apply(n.scope, [n, h, h]) : null
					}
				},
				isLoading : function (j) {
					return j ? Ext.lib.Ajax.isCallInProgress(j) : !!this.transId
				},
				abort : function (j) {
					if (j || this.isLoading()) {
						Ext.lib.Ajax.abort(j || this.transId)
					}
				},
				handleResponse : function (j) {
					this.transId = false;
					var k = j.argument.options;
					j.argument = k ? k.argument : null;
					this.fireEvent(e, this, j, k);
					if (k.success) {
						k.success.call(k.scope, j, k)
					}
					if (k.callback) {
						k.callback.call(k.scope, k, true, j)
					}
				},
				handleFailure : function (j, l) {
					this.transId = false;
					var k = j.argument.options;
					j.argument = k ? k.argument : null;
					this.fireEvent(d, this, j, k, l);
					if (k.failure) {
						k.failure.call(k.scope, j, k)
					}
					if (k.callback) {
						k.callback.call(k.scope, k, false, j)
					}
				},
				doFormUpload : function (q, j, k) {
					var l = Ext.id(),
					v = document,
					r = v.createElement("iframe"),
					m = Ext.getDom(q.form),
					u = [],
					t,
					p = "multipart/form-data",
					n = {
						target : m.target,
						method : m.method,
						encoding : m.encoding,
						enctype : m.enctype,
						action : m.action
					};
					Ext.fly(r).set({
							id : l,
							name : l,
							cls : "x-hidden",
							src : Ext.SSL_SECURE_URL
						});
					v.body.appendChild(r);
					if (Ext.isIE) {
						document.frames[l].name = l
					}
					Ext.fly(m).set({
							target : l,
							method : i,
							enctype : p,
							encoding : p,
							action : k || n.action
						});
					Ext.iterate(Ext.urlDecode(j, false), function (w, o) {
							t = v.createElement("input");
							Ext.fly(t).set({
									type : "hidden",
									value : o,
									name : w
								});
							m.appendChild(t);
							u.push(t)
						});
					function s() {
						var x = this,
						w = {
							responseText : "",
							responseXML : null,
							argument : q.argument
						},
						A,
						z;
						try {
							A = r.contentWindow.document || r.contentDocument || g.frames[l].document;
							if (A) {
								if (A.body) {
									if (/textarea/i.test((z = A.body.firstChild || {}).tagName)) {
										w.responseText = z.value
									} else {
										w.responseText = A.body.innerHTML
									}
								}
								w.responseXML = A.XMLDocument || A
							}
						} catch (y) {}
						
						Ext.EventManager.removeListener(r, c, s, x);
						x.fireEvent(e, x, w, q);
						function o(D, C, B) {
							if (Ext.isFunction(D)) {
								D.apply(C, B)
							}
						}
						o(q.success, q.scope, [w, q]);
						o(q.callback, q.scope, [q, true, w]);
						if (!x.debugUploads) {
							setTimeout(function () {
									Ext.removeNode(r)
								}, 100)
						}
					}
					Ext.EventManager.on(r, c, s, this);
					m.submit();
					Ext.fly(m).set(n);
					Ext.each(u, function (o) {
							Ext.removeNode(o)
						})
				}
			})
	})();
Ext.Ajax = new Ext.data.Connection({
			autoAbort : false,
			serializeForm : function (a) {
				return Ext.lib.Ajax.serializeForm(a)
			}
		});
Ext.util.JSON = new(function () {
			var useHasOwn = !!{}
			
			.hasOwnProperty,
			isNative = function () {
				var useNative = null;
				return function () {
					if (useNative === null) {
						useNative = Ext.USE_NATIVE_JSON && window.JSON && JSON.toString() == "[object JSON]"
					}
					return useNative
				}
			}
			(),
			pad = function (n) {
				return n < 10 ? "0" + n : n
			},
			doDecode = function (json) {
				return json ? eval("(" + json + ")") : ""
			},
			doEncode = function (o) {
				if (!Ext.isDefined(o) || o === null) {
					return "null"
				} else {
					if (Ext.isArray(o)) {
						return encodeArray(o)
					} else {
						if (Ext.isDate(o)) {
							return Ext.util.JSON.encodeDate(o)
						} else {
							if (Ext.isString(o)) {
								return encodeString(o)
							} else {
								if (typeof o == "number") {
									return isFinite(o) ? String(o) : "null"
								} else {
									if (Ext.isBoolean(o)) {
										return String(o)
									} else {
										var a = ["{"],
										b,
										i,
										v;
										for (i in o) {
											if (!o.getElementsByTagName) {
												if (!useHasOwn || o.hasOwnProperty(i)) {
													v = o[i];
													switch (typeof v) {
													case "undefined":
													case "function":
													case "unknown":
														break;
													default:
														if (b) {
															a.push(",")
														}
														a.push(doEncode(i), ":", v === null ? "null" : doEncode(v));
														b = true
													}
												}
											}
										}
										a.push("}");
										return a.join("")
									}
								}
							}
						}
					}
				}
			},
			m = {
				"\b" : "\\b",
				"\t" : "\\t",
				"\n" : "\\n",
				"\f" : "\\f",
				"\r" : "\\r",
				'"' : '\\"',
				"\\" : "\\\\"
			},
			encodeString = function (s) {
				if (/["\\\x00-\x1f]/.test(s)) {
					return '"' + s.replace(/([\x00-\x1f\\"])/g, function (a, b) {
							var c = m[b];
							if (c) {
								return c
							}
							c = b.charCodeAt();
							return "\\u00" + Math.floor(c / 16).toString(16) + (c % 16).toString(16)
						}) + '"'
				}
				return '"' + s + '"'
			},
			encodeArray = function (o) {
				var a = ["["],
				b,
				i,
				l = o.length,
				v;
				for (i = 0; i < l; i += 1) {
					v = o[i];
					switch (typeof v) {
					case "undefined":
					case "function":
					case "unknown":
						break;
					default:
						if (b) {
							a.push(",")
						}
						a.push(v === null ? "null" : Ext.util.JSON.encode(v));
						b = true
					}
				}
				a.push("]");
				return a.join("")
			};
			this.encodeDate = function (o) {
				return '"' + o.getFullYear() + "-" + pad(o.getMonth() + 1) + "-" + pad(o.getDate()) + "T" + pad(o.getHours()) + ":" + pad(o.getMinutes()) + ":" + pad(o.getSeconds()) + '"'
			};
			this.encode = function () {
				var ec;
				return function (o) {
					if (!ec) {
						ec = isNative() ? JSON.stringify : doEncode
					}
					return ec(o)
				}
			}
			();
			this.decode = function () {
				var dc;
				return function (json) {
					if (!dc) {
						dc = isNative() ? JSON.parse : doDecode
					}
					return dc(json)
				}
			}
			()
		})();
Ext.encode = Ext.util.JSON.encode;
Ext.decode = Ext.util.JSON.decode;
Ext.EventManager = function () {
	var z,
	p,
	j = false,
	l = Ext.isGecko || Ext.isWebKit || Ext.isSafari,
	o = Ext.lib.Event,
	q = Ext.lib.Dom,
	c = document,
	A = window,
	r = "DOMContentLoaded",
	t = "complete",
	g = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/,
	u = [];
	function n(E) {
		var H = false,
		D = 0,
		C = u.length,
		F = false,
		G;
		if (E) {
			if (E.getElementById || E.navigator) {
				for (; D < C; ++D) {
					G = u[D];
					if (G.el === E) {
						H = G.id;
						break
					}
				}
				if (!H) {
					H = Ext.id(E);
					u.push({
							id : H,
							el : E
						});
					F = true
				}
			} else {
				H = Ext.id(E)
			}
			if (!Ext.elCache[H]) {
				Ext.Element.addToCache(new Ext.Element(E), H);
				if (F) {
					Ext.elCache[H].skipGC = true
				}
			}
		}
		return H
	}
	function m(E, G, J, F, D, L) {
		E = Ext.getDom(E);
		var C = n(E),
		K = Ext.elCache[C].events,
		H;
		H = o.on(E, G, D);
		K[G] = K[G] || [];
		K[G].push([J, D, L, H, F]);
		if (E.addEventListener && G == "mousewheel") {
			var I = ["DOMMouseScroll", D, false];
			E.addEventListener.apply(E, I);
			Ext.EventManager.addListener(A, "unload", function () {
					E.removeEventListener.apply(E, I)
				})
		}
		if (E == c && G == "mousedown") {
			Ext.EventManager.stoppedMouseDownEvent.addListener(D)
		}
	}
	function d() {
		if (window != top) {
			return false
		}
		try {
			c.documentElement.doScroll("left")
		} catch (C) {
			return false
		}
		b();
		return true
	}
	function B(C) {
		if (Ext.isIE && d()) {
			return true
		}
		if (c.readyState == t) {
			b();
			return true
		}
		j || (p = setTimeout(arguments.callee, 2));
		return false
	}
	var k;
	function i(C) {
		k || (k = Ext.query("style, link[rel=stylesheet]"));
		if (k.length == c.styleSheets.length) {
			b();
			return true
		}
		j || (p = setTimeout(arguments.callee, 2));
		return false
	}
	function y(C) {
		c.removeEventListener(r, arguments.callee, false);
		i()
	}
	function b(C) {
		if (!j) {
			j = true;
			if (p) {
				clearTimeout(p)
			}
			if (l) {
				c.removeEventListener(r, b, false)
			}
			if (Ext.isIE && B.bindIE) {
				c.detachEvent("onreadystatechange", B)
			}
			o.un(A, "load", arguments.callee)
		}
		if (z && !Ext.isReady) {
			Ext.isReady = true;
			z.fire();
			z.listeners = []
		}
	}
	function a() {
		z || (z = new Ext.util.Event());
		if (l) {
			c.addEventListener(r, b, false)
		}
		if (Ext.isIE) {
			if (!B()) {
				B.bindIE = true;
				c.attachEvent("onreadystatechange", B)
			}
		} else {
			if (Ext.isOpera) {
				(c.readyState == t && i()) || c.addEventListener(r, y, false)
			} else {
				if (Ext.isWebKit) {
					B()
				}
			}
		}
		o.on(A, "load", b)
	}
	function x(C, D) {
		return function () {
			var E = Ext.toArray(arguments);
			if (D.target == Ext.EventObject.setEvent(E[0]).target) {
				C.apply(this, E)
			}
		}
	}
	function w(D, E, C) {
		return function (F) {
			C.delay(E.buffer, D, null, [new Ext.EventObjectImpl(F)])
		}
	}
	function s(G, F, C, E, D) {
		return function (H) {
			Ext.EventManager.removeListener(F, C, E, D);
			G(H)
		}
	}
	function e(D, E, C) {
		return function (G) {
			var F = new Ext.util.DelayedTask(D);
			if (!C.tasks) {
				C.tasks = []
			}
			C.tasks.push(F);
			F.delay(E.delay || 10, D, null, [new Ext.EventObjectImpl(G)])
		}
	}
	function h(H, G, C, J, K) {
		var D = (!C || typeof C == "boolean") ? {}
		
		 : C,
		E = Ext.getDom(H),
		F;
		J = J || D.fn;
		K = K || D.scope;
		if (!E) {
			throw 'Error listening for "' + G + '". Element "' + H + "\" doesn't exist."
		}
		function I(M) {
			if (!Ext) {
				return
			}
			M = Ext.EventObject.setEvent(M);
			var L;
			if (D.delegate) {
				if (!(L = M.getTarget(D.delegate, E))) {
					return
				}
			} else {
				L = M.target
			}
			if (D.stopEvent) {
				M.stopEvent()
			}
			if (D.preventDefault) {
				M.preventDefault()
			}
			if (D.stopPropagation) {
				M.stopPropagation()
			}
			if (D.normalized === false) {
				M = M.browserEvent
			}
			J.call(K || E, M, L, D)
		}
		if (D.target) {
			I = x(I, D)
		}
		if (D.delay) {
			I = e(I, D, J)
		}
		if (D.single) {
			I = s(I, E, G, J, K)
		}
		if (D.buffer) {
			F = new Ext.util.DelayedTask(I);
			I = w(I, D, F)
		}
		m(E, G, J, F, I, K);
		return I
	}
	var v = {
		addListener : function (E, C, G, F, D) {
			if (typeof C == "object") {
				var J = C,
				H,
				I;
				for (H in J) {
					I = J[H];
					if (!g.test(H)) {
						if (Ext.isFunction(I)) {
							h(E, H, J, I, J.scope)
						} else {
							h(E, H, I)
						}
					}
				}
			} else {
				h(E, C, D, G, F)
			}
		},
		removeListener : function (E, I, M, N) {
			E = Ext.getDom(E);
			var C = n(E),
			K = E && (Ext.elCache[C].events)[I] || [],
			D,
			H,
			F,
			G,
			J,
			L;
			for (H = 0, J = K.length; H < J; H++) {
				if (Ext.isArray(L = K[H]) && L[0] == M && (!N || L[2] == N)) {
					if (L[4]) {
						L[4].cancel()
					}
					G = M.tasks && M.tasks.length;
					if (G) {
						while (G--) {
							M.tasks[G].cancel()
						}
						delete M.tasks
					}
					D = L[1];
					o.un(E, I, o.extAdapter ? L[3] : D);
					if (D && E.addEventListener && I == "mousewheel") {
						E.removeEventListener("DOMMouseScroll", D, false)
					}
					if (D && E == c && I == "mousedown") {
						Ext.EventManager.stoppedMouseDownEvent.removeListener(D)
					}
					K.splice(H, 1);
					if (K.length === 0) {
						delete Ext.elCache[C].events[I]
					}
					for (G in Ext.elCache[C].events) {
						return false
					}
					Ext.elCache[C].events = {};
					return false
				}
			}
		},
		removeAll : function (E) {
			E = Ext.getDom(E);
			var D = n(E),
			J = Ext.elCache[D] || {},
			M = J.events || {},
			I,
			H,
			K,
			F,
			L,
			G,
			C;
			for (F in M) {
				if (M.hasOwnProperty(F)) {
					I = M[F];
					for (H = 0, K = I.length; H < K; H++) {
						L = I[H];
						if (L[4]) {
							L[4].cancel()
						}
						if (L[0].tasks && (G = L[0].tasks.length)) {
							while (G--) {
								L[0].tasks[G].cancel()
							}
							delete L.tasks
						}
						C = L[1];
						o.un(E, F, o.extAdapter ? L[3] : C);
						if (E.addEventListener && C && F == "mousewheel") {
							E.removeEventListener("DOMMouseScroll", C, false)
						}
						if (C && E == c && F == "mousedown") {
							Ext.EventManager.stoppedMouseDownEvent.removeListener(C)
						}
					}
				}
			}
			if (Ext.elCache[D]) {
				Ext.elCache[D].events = {}
				
			}
		},
		getListeners : function (F, C) {
			F = Ext.getDom(F);
			var H = n(F),
			D = Ext.elCache[H] || {},
			G = D.events || {},
			E = [];
			if (G && G[C]) {
				return G[C]
			} else {
				return null
			}
		},
		purgeElement : function (E, C, G) {
			E = Ext.getDom(E);
			var D = n(E),
			J = Ext.elCache[D] || {},
			K = J.events || {},
			F,
			I,
			H;
			if (G) {
				if (K && K.hasOwnProperty(G)) {
					I = K[G];
					for (F = 0, H = I.length; F < H; F++) {
						Ext.EventManager.removeListener(E, G, I[F][0])
					}
				}
			} else {
				Ext.EventManager.removeAll(E)
			}
			if (C && E && E.childNodes) {
				for (F = 0, H = E.childNodes.length; F < H; F++) {
					Ext.EventManager.purgeElement(E.childNodes[F], C, G)
				}
			}
		},
		_unload : function () {
			var C;
			for (C in Ext.elCache) {
				Ext.EventManager.removeAll(C)
			}
			delete Ext.elCache;
			delete Ext.Element._flyweights;
			var G,
			D,
			F,
			E = Ext.lib.Ajax;
			(typeof E.conn == "object") ? D = E.conn : D = {};
			for (F in D) {
				G = D[F];
				if (G) {
					E.abort({
							conn : G,
							tId : F
						})
				}
			}
		},
		onDocumentReady : function (E, D, C) {
			if (Ext.isReady) {
				z || (z = new Ext.util.Event());
				z.addListener(E, D, C);
				z.fire();
				z.listeners = []
			} else {
				if (!z) {
					a()
				}
				C = C || {};
				C.delay = C.delay || 1;
				z.addListener(E, D, C)
			}
		},
		fireDocReady : b
	};
	v.on = v.addListener;
	v.un = v.removeListener;
	v.stoppedMouseDownEvent = new Ext.util.Event();
	return v
}
();
Ext.onReady = Ext.EventManager.onDocumentReady;
(function () {
		var a = function () {
			var c = document.body || document.getElementsByTagName("body")[0];
			if (!c) {
				return false
			}
			var b = [" ", Ext.isIE ? "ext-ie " + (Ext.isIE6 ? "ext-ie6" : (Ext.isIE7 ? "ext-ie7" : (Ext.isIE8 ? "ext-ie8" : "ext-ie9"))) : Ext.isGecko ? "ext-gecko " + (Ext.isGecko2 ? "ext-gecko2" : "ext-gecko3") : Ext.isOpera ? "ext-opera" : Ext.isWebKit ? "ext-webkit" : ""];
			if (Ext.isSafari) {
				b.push("ext-safari " + (Ext.isSafari2 ? "ext-safari2" : (Ext.isSafari3 ? "ext-safari3" : "ext-safari4")))
			} else {
				if (Ext.isChrome) {
					b.push("ext-chrome")
				}
			}
			if (Ext.isMac) {
				b.push("ext-mac")
			}
			if (Ext.isLinux) {
				b.push("ext-linux")
			}
			if (Ext.isStrict || Ext.isBorderBox) {
				var d = c.parentNode;
				if (d) {
					if (!Ext.isStrict) {
						Ext.fly(d, "_internal").addClass("x-quirks");
						if (Ext.isIE && !Ext.isStrict) {
							Ext.isIEQuirks = true
						}
					}
					Ext.fly(d, "_internal").addClass(((Ext.isStrict && Ext.isIE) || (!Ext.enableForcedBoxModel && !Ext.isIE)) ? " ext-strict" : " ext-border-box")
				}
			}
			if (Ext.enableForcedBoxModel && !Ext.isIE) {
				Ext.isForcedBorderBox = true;
				b.push("ext-forced-border-box")
			}
			Ext.fly(c, "_internal").addClass(b);
			return true
		};
		if (!a()) {
			Ext.onReady(a)
		}
	})();
(function () {
		var b = Ext.apply(Ext.supports, {
					correctRightMargin : true,
					correctTransparentColor : true,
					cssFloat : true
				});
		var a = function () {
			var g = document.createElement("div"),
			e = document,
			c,
			d;
			g.innerHTML = '<div style="height:30px;width:50px;"><div style="height:20px;width:20px;"></div></div><div style="float:left;background-color:transparent;">';
			e.body.appendChild(g);
			d = g.lastChild;
			if ((c = e.defaultView)) {
				if (c.getComputedStyle(g.firstChild.firstChild, null).marginRight != "0px") {
					b.correctRightMargin = false
				}
				if (c.getComputedStyle(d, null).backgroundColor != "transparent") {
					b.correctTransparentColor = false
				}
			}
			b.cssFloat = !!d.style.cssFloat;
			e.body.removeChild(g)
		};
		if (Ext.isReady) {
			a()
		} else {
			Ext.onReady(a)
		}
	})();
Ext.EventObject = function () {
	var b = Ext.lib.Event,
	c = /(dbl)?click/,
	a = {
		3 : 13,
		63234 : 37,
		63235 : 39,
		63232 : 38,
		63233 : 40,
		63276 : 33,
		63277 : 34,
		63272 : 46,
		63273 : 36,
		63275 : 35
	},
	d = Ext.isIE ? {
			1 : 0,
			4 : 1,
			2 : 2
		}
		 : {
			0 : 0,
			1 : 1,
			2 : 2
		};
	Ext.EventObjectImpl = function (g) {
		if (g) {
			this.setEvent(g.browserEvent || g)
		}
	};
	Ext.EventObjectImpl.prototype = {
		setEvent : function (h) {
			var g = this;
			if (h == g || (h && h.browserEvent)) {
				return h
			}
			g.browserEvent = h;
			if (h) {
				g.button = h.button ? d[h.button] : (h.which ? h.which - 1 : -1);
				if (c.test(h.type) && g.button == -1) {
					g.button = 0
				}
				g.type = h.type;
				g.shiftKey = h.shiftKey;
				g.ctrlKey = h.ctrlKey || h.metaKey || false;
				g.altKey = h.altKey;
				g.keyCode = h.keyCode;
				g.charCode = h.charCode;
				g.target = b.getTarget(h);
				g.xy = b.getXY(h)
			} else {
				g.button = -1;
				g.shiftKey = false;
				g.ctrlKey = false;
				g.altKey = false;
				g.keyCode = 0;
				g.charCode = 0;
				g.target = null;
				g.xy = [0, 0]
			}
			return g
		},
		stopEvent : function () {
			var e = this;
			if (e.browserEvent) {
				if (e.browserEvent.type == "mousedown") {
					Ext.EventManager.stoppedMouseDownEvent.fire(e)
				}
				b.stopEvent(e.browserEvent)
			}
		},
		preventDefault : function () {
			if (this.browserEvent) {
				b.preventDefault(this.browserEvent)
			}
		},
		stopPropagation : function () {
			var e = this;
			if (e.browserEvent) {
				if (e.browserEvent.type == "mousedown") {
					Ext.EventManager.stoppedMouseDownEvent.fire(e)
				}
				b.stopPropagation(e.browserEvent)
			}
		},
		getCharCode : function () {
			return this.charCode || this.keyCode
		},
		getKey : function () {
			return this.normalizeKey(this.keyCode || this.charCode)
		},
		normalizeKey : function (e) {
			return Ext.isSafari ? (a[e] || e) : e
		},
		getPageX : function () {
			return this.xy[0]
		},
		getPageY : function () {
			return this.xy[1]
		},
		getXY : function () {
			return this.xy
		},
		getTarget : function (g, h, e) {
			return g ? Ext.fly(this.target).findParent(g, h, e) : (e ? Ext.get(this.target) : this.target)
		},
		getRelatedTarget : function () {
			return this.browserEvent ? b.getRelatedTarget(this.browserEvent) : null
		},
		getWheelDelta : function () {
			var g = this.browserEvent;
			var h = 0;
			if (g.wheelDelta) {
				h = g.wheelDelta / 120
			} else {
				if (g.detail) {
					h = -g.detail / 3
				}
			}
			return h
		},
		within : function (h, i, e) {
			if (h) {
				var g = this[i ? "getRelatedTarget" : "getTarget"]();
				return g && ((e ? (g == Ext.getDom(h)) : false) || Ext.fly(h).contains(g))
			}
			return false
		}
	};
	return new Ext.EventObjectImpl()
}
();
Ext.Loader = Ext.apply({}, {
			load : function (j, i, k, c) {
				var k = k || this,
				g = document.getElementsByTagName("head")[0],
				b = document.createDocumentFragment(),
				a = j.length,
				h = 0,
				e = this;
				var l = function (m) {
					g.appendChild(e.buildScriptTag(j[m], d))
				};
				var d = function () {
					h++;
					if (a == h && typeof i == "function") {
						i.call(k)
					} else {
						if (c === true) {
							l(h)
						}
					}
				};
				if (c === true) {
					l.call(this, 0)
				} else {
					Ext.each(j, function (n, m) {
							b.appendChild(this.buildScriptTag(n, d))
						}, this);
					g.appendChild(b)
				}
			},
			buildScriptTag : function (b, c) {
				var a = document.createElement("script");
				a.type = "text/javascript";
				a.src = b;
				if (a.readyState) {
					a.onreadystatechange = function () {
						if (a.readyState == "loaded" || a.readyState == "complete") {
							a.onreadystatechange = null;
							c()
						}
					}
				} else {
					a.onload = c
				}
				return a
			}
		});
Ext.ns("Ext.grid", "Ext.list", "Ext.dd", "Ext.tree", "Ext.form", "Ext.menu", "Ext.state", "Ext.layout.boxOverflow", "Ext.app", "Ext.ux", "Ext.chart", "Ext.direct", "Ext.slider");
Ext.apply(Ext, function () {
		var c = Ext,
		a = 0,
		b = null;
		return {
			emptyFn : function () {},
			BLANK_IMAGE_URL : Ext.isIE6 || Ext.isIE7 || Ext.isAir ? "http://www.extjs.com/s.gif" : "",
			extendX : function (d, e) {
				return Ext.extend(d, e(d.prototype))
			},
			getDoc : function () {
				return Ext.get(document)
			},
			num : function (e, d) {
				e = Number(Ext.isEmpty(e) || Ext.isArray(e) || typeof e == "boolean" || (typeof e == "string" && e.trim().length == 0) ? NaN : e);
				return isNaN(e) ? d : e
			},
			value : function (g, d, e) {
				return Ext.isEmpty(g, e) ? d : g
			},
			escapeRe : function (d) {
				return d.replace(/([-.*+?^${}()|[\]\/\\])/g, "\\$1")
			},
			sequence : function (h, d, g, e) {
				h[d] = h[d].createSequence(g, e)
			},
			addBehaviors : function (i) {
				if (!Ext.isReady) {
					Ext.onReady(function () {
							Ext.addBehaviors(i)
						})
				} else {
					var e = {},
					h,
					d,
					g;
					for (d in i) {
						if ((h = d.split("@"))[1]) {
							g = h[0];
							if (!e[g]) {
								e[g] = Ext.select(g)
							}
							e[g].on(h[1], i[d])
						}
					}
					e = null
				}
			},
			getScrollBarWidth : function (g) {
				if (!Ext.isReady) {
					return 0
				}
				if (g === true || b === null) {
					var i = Ext.getBody().createChild('<div class="x-hide-offsets" style="width:100px;height:50px;overflow:hidden;"><div style="height:200px;"></div></div>'),
					h = i.child("div", true);
					var e = h.offsetWidth;
					i.setStyle("overflow", (Ext.isWebKit || Ext.isGecko) ? "auto" : "scroll");
					var d = h.offsetWidth;
					i.remove();
					b = e - d + 2
				}
				return b
			},
			combine : function () {
				var g = arguments,
				e = g.length,
				j = [];
				for (var h = 0; h < e; h++) {
					var d = g[h];
					if (Ext.isArray(d)) {
						j = j.concat(d)
					} else {
						if (d.length !== undefined && !d.substr) {
							j = j.concat(Array.prototype.slice.call(d, 0))
						} else {
							j.push(d)
						}
					}
				}
				return j
			},
			copyTo : function (d, e, g) {
				if (typeof g == "string") {
					g = g.split(/[,;\s]/)
				}
				Ext.each(g, function (h) {
						if (e.hasOwnProperty(h)) {
							d[h] = e[h]
						}
					}, this);
				return d
			},
			destroy : function () {
				Ext.each(arguments, function (d) {
						if (d) {
							if (Ext.isArray(d)) {
								this.destroy.apply(this, d)
							} else {
								if (typeof d.destroy == "function") {
									d.destroy()
								} else {
									if (d.dom) {
										d.remove()
									}
								}
							}
						}
					}, this)
			},
			destroyMembers : function (l, j, g, h) {
				for (var k = 1, e = arguments, d = e.length; k < d; k++) {
					Ext.destroy(l[e[k]]);
					delete l[e[k]]
				}
			},
			clean : function (d) {
				var e = [];
				Ext.each(d, function (g) {
						if (!!g) {
							e.push(g)
						}
					});
				return e
			},
			unique : function (d) {
				var e = [],
				g = {};
				Ext.each(d, function (h) {
						if (!g[h]) {
							e.push(h)
						}
						g[h] = true
					});
				return e
			},
			flatten : function (d) {
				var g = [];
				function e(h) {
					Ext.each(h, function (i) {
							if (Ext.isArray(i)) {
								e(i)
							} else {
								g.push(i)
							}
						});
					return g
				}
				return e(d)
			},
			min : function (d, e) {
				var g = d[0];
				e = e || function (i, h) {
					return i < h ? -1 : 1
				};
				Ext.each(d, function (h) {
						g = e(g, h) == -1 ? g : h
					});
				return g
			},
			max : function (d, e) {
				var g = d[0];
				e = e || function (i, h) {
					return i > h ? 1 : -1
				};
				Ext.each(d, function (h) {
						g = e(g, h) == 1 ? g : h
					});
				return g
			},
			mean : function (d) {
				return d.length > 0 ? Ext.sum(d) / d.length : undefined
			},
			sum : function (d) {
				var e = 0;
				Ext.each(d, function (g) {
						e += g
					});
				return e
			},
			partition : function (d, e) {
				var g = [[], []];
				Ext.each(d, function (j, k, h) {
						g[(e && e(j, k, h)) || (!e && j) ? 0 : 1].push(j)
					});
				return g
			},
			invoke : function (d, e) {
				var h = [],
				g = Array.prototype.slice.call(arguments, 2);
				Ext.each(d, function (j, k) {
						if (j && typeof j[e] == "function") {
							h.push(j[e].apply(j, g))
						} else {
							h.push(undefined)
						}
					});
				return h
			},
			pluck : function (d, g) {
				var e = [];
				Ext.each(d, function (h) {
						e.push(h[g])
					});
				return e
			},
			zip : function () {
				var n = Ext.partition(arguments, function (i) {
							return typeof i != "function"
						}),
				k = n[0],
				m = n[1][0],
				d = Ext.max(Ext.pluck(k, "length")),
				h = [];
				for (var l = 0; l < d; l++) {
					h[l] = [];
					if (m) {
						h[l] = m.apply(m, Ext.pluck(k, l))
					} else {
						for (var g = 0, e = k.length; g < e; g++) {
							h[l].push(k[g][l])
						}
					}
				}
				return h
			},
			getCmp : function (d) {
				return Ext.ComponentMgr.get(d)
			},
			useShims : c.isIE6 || (c.isMac && c.isGecko2),
			type : function (e) {
				if (e === undefined || e === null) {
					return false
				}
				if (e.htmlElement) {
					return "element"
				}
				var d = typeof e;
				if (d == "object" && e.nodeName) {
					switch (e.nodeType) {
					case 1:
						return "element";
					case 3:
						return (/\S/).test(e.nodeValue) ? "textnode" : "whitespace"
					}
				}
				if (d == "object" || d == "function") {
					switch (e.constructor) {
					case Array:
						return "array";
					case RegExp:
						return "regexp";
					case Date:
						return "date"
					}
					if (typeof e.length == "number" && typeof e.item == "function") {
						return "nodelist"
					}
				}
				return d
			},
			intercept : function (h, d, g, e) {
				h[d] = h[d].createInterceptor(g, e)
			},
			callback : function (d, h, g, e) {
				if (typeof d == "function") {
					if (e) {
						d.defer(e, h, g || [])
					} else {
						d.apply(h, g || [])
					}
				}
			}
		}
	}
	());
Ext.apply(Function.prototype, {
		createSequence : function (b, a) {
			var c = this;
			return (typeof b != "function") ? this : function () {
				var d = c.apply(this || window, arguments);
				b.apply(a || this || window, arguments);
				return d
			}
		}
	});
Ext.applyIf(String, {
		escape : function (a) {
			return a.replace(/('|\\)/g, "\\$1")
		},
		leftPad : function (d, b, c) {
			var a = String(d);
			if (!c) {
				c = " "
			}
			while (a.length < b) {
				a = c + a
			}
			return a
		}
	});
String.prototype.toggle = function (b, a) {
	return this == b ? a : b
};
String.prototype.trim = function () {
	var a = /^\s+|\s+$/g;
	return function () {
		return this.replace(a, "")
	}
}
();
Date.prototype.getElapsed = function (a) {
	return Math.abs((a || new Date()).getTime() - this.getTime())
};
Ext.applyIf(Number.prototype, {
		constrain : function (b, a) {
			return Math.min(Math.max(this, b), a)
		}
	});
Ext.lib.Dom.getRegion = function (a) {
	return Ext.lib.Region.getRegion(a)
};
Ext.lib.Region = function (d, g, a, c) {
	var e = this;
	e.top = d;
	e[1] = d;
	e.right = g;
	e.bottom = a;
	e.left = c;
	e[0] = c
};
Ext.lib.Region.prototype = {
	contains : function (b) {
		var a = this;
		return (b.left >= a.left && b.right <= a.right && b.top >= a.top && b.bottom <= a.bottom)
	},
	getArea : function () {
		var a = this;
		return ((a.bottom - a.top) * (a.right - a.left))
	},
	intersect : function (h) {
		var g = this,
		d = Math.max(g.top, h.top),
		e = Math.min(g.right, h.right),
		a = Math.min(g.bottom, h.bottom),
		c = Math.max(g.left, h.left);
		if (a >= d && e >= c) {
			return new Ext.lib.Region(d, e, a, c)
		}
	},
	union : function (h) {
		var g = this,
		d = Math.min(g.top, h.top),
		e = Math.max(g.right, h.right),
		a = Math.max(g.bottom, h.bottom),
		c = Math.min(g.left, h.left);
		return new Ext.lib.Region(d, e, a, c)
	},
	constrainTo : function (b) {
		var a = this;
		a.top = a.top.constrain(b.top, b.bottom);
		a.bottom = a.bottom.constrain(b.top, b.bottom);
		a.left = a.left.constrain(b.left, b.right);
		a.right = a.right.constrain(b.left, b.right);
		return a
	},
	adjust : function (d, c, a, g) {
		var e = this;
		e.top += d;
		e.left += c;
		e.right += g;
		e.bottom += a;
		return e
	}
};
Ext.lib.Region.getRegion = function (e) {
	var h = Ext.lib.Dom.getXY(e),
	d = h[1],
	g = h[0] + e.offsetWidth,
	a = h[1] + e.offsetHeight,
	c = h[0];
	return new Ext.lib.Region(d, g, a, c)
};
Ext.lib.Point = function (a, c) {
	if (Ext.isArray(a)) {
		c = a[1];
		a = a[0]
	}
	var b = this;
	b.x = b.right = b.left = b[0] = a;
	b.y = b.top = b.bottom = b[1] = c
};
Ext.lib.Point.prototype = new Ext.lib.Region();
Ext.apply(Ext.DomHelper, function () {
		var e,
		a = "afterbegin",
		h = "afterend",
		i = "beforebegin",
		d = "beforeend",
		b = /tag|children|cn|html$/i;
		function g(m, p, n, q, l, j) {
			m = Ext.getDom(m);
			var k;
			if (e.useDom) {
				k = c(p, null);
				if (j) {
					m.appendChild(k)
				} else {
					(l == "firstChild" ? m : m.parentNode).insertBefore(k, m[l] || m)
				}
			} else {
				k = Ext.DomHelper.insertHtml(q, m, Ext.DomHelper.createHtml(p))
			}
			return n ? Ext.get(k, true) : k
		}
		function c(j, r) {
			var k,
			u = document,
			p,
			s,
			m,
			t;
			if (Ext.isArray(j)) {
				k = u.createDocumentFragment();
				for (var q = 0, n = j.length; q < n; q++) {
					c(j[q], k)
				}
			} else {
				if (typeof j == "string") {
					k = u.createTextNode(j)
				} else {
					k = u.createElement(j.tag || "div");
					p = !!k.setAttribute;
					for (var s in j) {
						if (!b.test(s)) {
							m = j[s];
							if (s == "cls") {
								k.className = m
							} else {
								if (p) {
									k.setAttribute(s, m)
								} else {
									k[s] = m
								}
							}
						}
					}
					Ext.DomHelper.applyStyles(k, j.style);
					if ((t = j.children || j.cn)) {
						c(t, k)
					} else {
						if (j.html) {
							k.innerHTML = j.html
						}
					}
				}
			}
			if (r) {
				r.appendChild(k)
			}
			return k
		}
		e = {
			createTemplate : function (k) {
				var j = Ext.DomHelper.createHtml(k);
				return new Ext.Template(j)
			},
			useDom : false,
			insertBefore : function (j, l, k) {
				return g(j, l, k, i)
			},
			insertAfter : function (j, l, k) {
				return g(j, l, k, h, "nextSibling")
			},
			insertFirst : function (j, l, k) {
				return g(j, l, k, a, "firstChild")
			},
			append : function (j, l, k) {
				return g(j, l, k, d, "", true)
			},
			createDom : c
		};
		return e
	}
	());
Ext.apply(Ext.Template.prototype, {
		disableFormats : false,
		re : /\{([\w\-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,
		argsRe : /^\s*['"](.*)["']\s*$/,
		compileARe : /\\/g,
		compileBRe : /(\r\n|\n)/g,
		compileCRe : /'/g,
		applyTemplate : function (b) {
			var g = this,
			a = g.disableFormats !== true,
			e = Ext.util.Format,
			c = g;
			if (g.compiled) {
				return g.compiled(b)
			}
			function d(j, l, p, k) {
				if (p && a) {
					if (p.substr(0, 5) == "this.") {
						return c.call(p.substr(5), b[l], b)
					} else {
						if (k) {
							var o = g.argsRe;
							k = k.split(",");
							for (var n = 0, h = k.length; n < h; n++) {
								k[n] = k[n].replace(o, "$1")
							}
							k = [b[l]].concat(k)
						} else {
							k = [b[l]]
						}
						return e[p].apply(e, k)
					}
				} else {
					return b[l] !== undefined ? b[l] : ""
				}
			}
			return g.html.replace(g.re, d)
		},
		compile : function () {
			var me = this,
			fm = Ext.util.Format,
			useF = me.disableFormats !== true,
			sep = Ext.isGecko ? "+" : ",",
			body;
			function fn(m, name, format, args) {
				if (format && useF) {
					args = args ? "," + args : "";
					if (format.substr(0, 5) != "this.") {
						format = "fm." + format + "("
					} else {
						format = 'this.call("' + format.substr(5) + '", ';
						args = ", values"
					}
				} else {
					args = "";
					format = "(values['" + name + "'] == undefined ? '' : "
				}
				return "'" + sep + format + "values['" + name + "']" + args + ")" + sep + "'"
			}
			if (Ext.isGecko) {
				body = "this.compiled = function(values){ return '" + me.html.replace(me.compileARe, "\\\\").replace(me.compileBRe, "\\n").replace(me.compileCRe, "\\'").replace(me.re, fn) + "';};"
			} else {
				body = ["this.compiled = function(values){ return ['"];
				body.push(me.html.replace(me.compileARe, "\\\\").replace(me.compileBRe, "\\n").replace(me.compileCRe, "\\'").replace(me.re, fn));
				body.push("'].join('');};");
				body = body.join("")
			}
			eval(body);
			return me
		},
		call : function (c, b, a) {
			return this[c](b, a)
		}
	});
Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;
Ext.util.Functions = {
	createInterceptor : function (c, b, a) {
		var d = c;
		if (!Ext.isFunction(b)) {
			return c
		} else {
			return function () {
				var g = this,
				e = arguments;
				b.target = g;
				b.method = c;
				return (b.apply(a || g || window, e) !== false) ? c.apply(g || window, e) : null
			}
		}
	},
	createDelegate : function (c, d, b, a) {
		if (!Ext.isFunction(c)) {
			return c
		}
		return function () {
			var g = b || arguments;
			if (a === true) {
				g = Array.prototype.slice.call(arguments, 0);
				g = g.concat(b)
			} else {
				if (Ext.isNumber(a)) {
					g = Array.prototype.slice.call(arguments, 0);
					var e = [a, 0].concat(b);
					Array.prototype.splice.apply(g, e)
				}
			}
			return c.apply(d || window, g)
		}
	},
	defer : function (d, c, e, b, a) {
		d = Ext.util.Functions.createDelegate(d, e, b, a);
		if (c > 0) {
			return setTimeout(d, c)
		}
		d();
		return 0
	},
	createSequence : function (c, b, a) {
		if (!Ext.isFunction(b)) {
			return c
		} else {
			return function () {
				var d = c.apply(this || window, arguments);
				b.apply(a || this || window, arguments);
				return d
			}
		}
	}
};
Ext.defer = Ext.util.Functions.defer;
Ext.createInterceptor = Ext.util.Functions.createInterceptor;
Ext.createSequence = Ext.util.Functions.createSequence;
Ext.createDelegate = Ext.util.Functions.createDelegate;
Ext.apply(Ext.util.Observable.prototype, function () {
		function a(j) {
			var i = (this.methodEvents = this.methodEvents || {})[j],
			d,
			c,
			g,
			h = this;
			if (!i) {
				this.methodEvents[j] = i = {};
				i.originalFn = this[j];
				i.methodName = j;
				i.before = [];
				i.after = [];
				var b = function (l, k, e) {
					if ((c = l.apply(k || h, e)) !== undefined) {
						if (typeof c == "object") {
							if (c.returnValue !== undefined) {
								d = c.returnValue
							} else {
								d = c
							}
							g = !!c.cancel
						} else {
							if (c === false) {
								g = true
							} else {
								d = c
							}
						}
					}
				};
				this[j] = function () {
					var l = Array.prototype.slice.call(arguments, 0),
					k;
					d = c = undefined;
					g = false;
					for (var m = 0, e = i.before.length; m < e; m++) {
						k = i.before[m];
						b(k.fn, k.scope, l);
						if (g) {
							return d
						}
					}
					if ((c = i.originalFn.apply(h, l)) !== undefined) {
						d = c
					}
					for (var m = 0, e = i.after.length; m < e; m++) {
						k = i.after[m];
						b(k.fn, k.scope, l);
						if (g) {
							return d
						}
					}
					return d
				}
			}
			return i
		}
		return {
			beforeMethod : function (d, c, b) {
				a.call(this, d).before.push({
						fn : c,
						scope : b
					})
			},
			afterMethod : function (d, c, b) {
				a.call(this, d).after.push({
						fn : c,
						scope : b
					})
			},
			removeMethodListener : function (j, g, d) {
				var h = this.getMethodEvent(j);
				for (var c = 0, b = h.before.length; c < b; c++) {
					if (h.before[c].fn == g && h.before[c].scope == d) {
						h.before.splice(c, 1);
						return
					}
				}
				for (var c = 0, b = h.after.length; c < b; c++) {
					if (h.after[c].fn == g && h.after[c].scope == d) {
						h.after.splice(c, 1);
						return
					}
				}
			},
			relayEvents : function (j, e) {
				var h = this;
				function g(i) {
					return function () {
						return h.fireEvent.apply(h, [i].concat(Array.prototype.slice.call(arguments, 0)))
					}
				}
				for (var d = 0, b = e.length; d < b; d++) {
					var c = e[d];
					h.events[c] = h.events[c] || true;
					j.on(c, g(c), h)
				}
			},
			enableBubble : function (e) {
				var g = this;
				if (!Ext.isEmpty(e)) {
					e = Ext.isArray(e) ? e : Array.prototype.slice.call(arguments, 0);
					for (var d = 0, b = e.length; d < b; d++) {
						var c = e[d];
						c = c.toLowerCase();
						var h = g.events[c] || true;
						if (typeof h == "boolean") {
							h = new Ext.util.Event(g, c);
							g.events[c] = h
						}
						h.bubble = true
					}
				}
			}
		}
	}
	());
Ext.util.Observable.capture = function (c, b, a) {
	c.fireEvent = c.fireEvent.createInterceptor(b, a)
};
Ext.util.Observable.observeClass = function (b, a) {
	if (b) {
		if (!b.fireEvent) {
			Ext.apply(b, new Ext.util.Observable());
			Ext.util.Observable.capture(b.prototype, b.fireEvent, b)
		}
		if (typeof a == "object") {
			b.on(a)
		}
		return b
	}
};
Ext.apply(Ext.EventManager, function () {
		var d,
		k,
		g,
		b,
		a = Ext.lib.Dom,
		j = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/,
		c = Ext.EventManager._unload,
		i = 0,
		h = 0,
		e = Ext.isWebKit ? Ext.num(navigator.userAgent.match(/AppleWebKit\/(\d+)/)[1]) >= 525 : !((Ext.isGecko && !Ext.isWindows) || Ext.isOpera);
		return {
			_unload : function () {
				Ext.EventManager.un(window, "resize", this.fireWindowResize, this);
				c.call(Ext.EventManager)
			},
			doResizeEvent : function () {
				var m = a.getViewHeight(),
				l = a.getViewWidth();
				if (h != m || i != l) {
					d.fire(i = l, h = m)
				}
			},
			onWindowResize : function (n, m, l) {
				if (!d) {
					d = new Ext.util.Event();
					k = new Ext.util.DelayedTask(this.doResizeEvent);
					Ext.EventManager.on(window, "resize", this.fireWindowResize, this)
				}
				d.addListener(n, m, l)
			},
			fireWindowResize : function () {
				if (d) {
					k.delay(100)
				}
			},
			onTextResize : function (o, n, l) {
				if (!g) {
					g = new Ext.util.Event();
					var m = new Ext.Element(document.createElement("div"));
					m.dom.className = "x-text-resize";
					m.dom.innerHTML = "X";
					m.appendTo(document.body);
					b = m.dom.offsetHeight;
					setInterval(function () {
							if (m.dom.offsetHeight != b) {
								g.fire(b, b = m.dom.offsetHeight)
							}
						}, this.textResizeInterval)
				}
				g.addListener(o, n, l)
			},
			removeResizeListener : function (m, l) {
				if (d) {
					d.removeListener(m, l)
				}
			},
			fireResize : function () {
				if (d) {
					d.fire(a.getViewWidth(), a.getViewHeight())
				}
			},
			textResizeInterval : 50,
			ieDeferSrc : false,
			getKeyEvent : function () {
				return e ? "keydown" : "keypress"
			},
			useKeydown : e
		}
	}
	());
Ext.EventManager.on = Ext.EventManager.addListener;
Ext.apply(Ext.EventObjectImpl.prototype, {
		BACKSPACE : 8,
		TAB : 9,
		NUM_CENTER : 12,
		ENTER : 13,
		RETURN : 13,
		SHIFT : 16,
		CTRL : 17,
		CONTROL : 17,
		ALT : 18,
		PAUSE : 19,
		CAPS_LOCK : 20,
		ESC : 27,
		SPACE : 32,
		PAGE_UP : 33,
		PAGEUP : 33,
		PAGE_DOWN : 34,
		PAGEDOWN : 34,
		END : 35,
		HOME : 36,
		LEFT : 37,
		UP : 38,
		RIGHT : 39,
		DOWN : 40,
		PRINT_SCREEN : 44,
		INSERT : 45,
		DELETE : 46,
		ZERO : 48,
		ONE : 49,
		TWO : 50,
		THREE : 51,
		FOUR : 52,
		FIVE : 53,
		SIX : 54,
		SEVEN : 55,
		EIGHT : 56,
		NINE : 57,
		A : 65,
		B : 66,
		C : 67,
		D : 68,
		E : 69,
		F : 70,
		G : 71,
		H : 72,
		I : 73,
		J : 74,
		K : 75,
		L : 76,
		M : 77,
		N : 78,
		O : 79,
		P : 80,
		Q : 81,
		R : 82,
		S : 83,
		T : 84,
		U : 85,
		V : 86,
		W : 87,
		X : 88,
		Y : 89,
		Z : 90,
		CONTEXT_MENU : 93,
		NUM_ZERO : 96,
		NUM_ONE : 97,
		NUM_TWO : 98,
		NUM_THREE : 99,
		NUM_FOUR : 100,
		NUM_FIVE : 101,
		NUM_SIX : 102,
		NUM_SEVEN : 103,
		NUM_EIGHT : 104,
		NUM_NINE : 105,
		NUM_MULTIPLY : 106,
		NUM_PLUS : 107,
		NUM_MINUS : 109,
		NUM_PERIOD : 110,
		NUM_DIVISION : 111,
		F1 : 112,
		F2 : 113,
		F3 : 114,
		F4 : 115,
		F5 : 116,
		F6 : 117,
		F7 : 118,
		F8 : 119,
		F9 : 120,
		F10 : 121,
		F11 : 122,
		F12 : 123,
		isNavKeyPress : function () {
			var b = this,
			a = this.normalizeKey(b.keyCode);
			return (a >= 33 && a <= 40) || a == b.RETURN || a == b.TAB || a == b.ESC
		},
		isSpecialKey : function () {
			var a = this.normalizeKey(this.keyCode);
			return (this.type == "keypress" && this.ctrlKey) || this.isNavKeyPress() || (a == this.BACKSPACE) || (a >= 16 && a <= 20) || (a >= 44 && a <= 46)
		},
		getPoint : function () {
			return new Ext.lib.Point(this.xy[0], this.xy[1])
		},
		hasModifier : function () {
			return ((this.ctrlKey || this.altKey) || this.shiftKey)
		}
	});
Ext.Element.addMethods({
		swallowEvent : function (a, b) {
			var d = this;
			function c(g) {
				g.stopPropagation();
				if (b) {
					g.preventDefault()
				}
			}
			if (Ext.isArray(a)) {
				Ext.each(a, function (g) {
						d.on(g, c)
					});
				return d
			}
			d.on(a, c);
			return d
		},
		relayEvent : function (a, b) {
			this.on(a, function (c) {
					b.fireEvent(a, c)
				})
		},
		clean : function (b) {
			var d = this,
			e = d.dom,
			g = e.firstChild,
			c = -1;
			if (Ext.Element.data(e, "isCleaned") && b !== true) {
				return d
			}
			while (g) {
				var a = g.nextSibling;
				if (g.nodeType == 3 && !(/\S/.test(g.nodeValue))) {
					e.removeChild(g)
				} else {
					g.nodeIndex = ++c
				}
				g = a
			}
			Ext.Element.data(e, "isCleaned", true);
			return d
		},
		load : function () {
			var a = this.getUpdater();
			a.update.apply(a, arguments);
			return this
		},
		getUpdater : function () {
			return this.updateManager || (this.updateManager = new Ext.Updater(this))
		},
		update : function (html, loadScripts, callback) {
			if (!this.dom) {
				return this
			}
			html = html || "";
			if (loadScripts !== true) {
				this.dom.innerHTML = html;
				if (typeof callback == "function") {
					callback()
				}
				return this
			}
			var id = Ext.id(),
			dom = this.dom;
			html += '<span id="' + id + '"></span>';
			Ext.lib.Event.onAvailable(id, function () {
					var DOC = document,
					hd = DOC.getElementsByTagName("head")[0],
					re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig,
					srcRe = /\ssrc=([\'\"])(.*?)\1/i,
					typeRe = /\stype=([\'\"])(.*?)\1/i,
					match,
					attrs,
					srcMatch,
					typeMatch,
					el,
					s;
					while ((match = re.exec(html))) {
						attrs = match[1];
						srcMatch = attrs ? attrs.match(srcRe) : false;
						if (srcMatch && srcMatch[2]) {
							s = DOC.createElement("script");
							s.src = srcMatch[2];
							typeMatch = attrs.match(typeRe);
							if (typeMatch && typeMatch[2]) {
								s.type = typeMatch[2]
							}
							hd.appendChild(s)
						} else {
							if (match[2] && match[2].length > 0) {
								if (window.execScript) {
									window.execScript(match[2])
								} else {
									window.eval(match[2])
								}
							}
						}
					}
					el = DOC.getElementById(id);
					if (el) {
						Ext.removeNode(el)
					}
					if (typeof callback == "function") {
						callback()
					}
				});
			dom.innerHTML = html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, "");
			return this
		},
		removeAllListeners : function () {
			this.removeAnchor();
			Ext.EventManager.removeAll(this.dom);
			return this
		},
		createProxy : function (a, e, d) {
			a = (typeof a == "object") ? a : {
				tag : "div",
				cls : a
			};
			var c = this,
			b = e ? Ext.DomHelper.append(e, a, true) : Ext.DomHelper.insertBefore(c.dom, a, true);
			if (d && c.setBox && c.getBox) {
				b.setBox(c.getBox())
			}
			return b
		}
	});
Ext.Element.prototype.getUpdateManager = Ext.Element.prototype.getUpdater;
Ext.Element.addMethods({
		getAnchorXY : function (e, l, q) {
			e = (e || "tl").toLowerCase();
			q = q || {};
			var k = this,
			b = k.dom == document.body || k.dom == document,
			n = q.width || b ? Ext.lib.Dom.getViewWidth() : k.getWidth(),
			i = q.height || b ? Ext.lib.Dom.getViewHeight() : k.getHeight(),
			p,
			a = Math.round,
			c = k.getXY(),
			m = k.getScroll(),
			j = b ? m.left : !l ? c[0] : 0,
			g = b ? m.top : !l ? c[1] : 0,
			d = {
				c : [a(n * 0.5), a(i * 0.5)],
				t : [a(n * 0.5), 0],
				l : [0, a(i * 0.5)],
				r : [n, a(i * 0.5)],
				b : [a(n * 0.5), i],
				tl : [0, 0],
				bl : [0, i],
				br : [n, i],
				tr : [n, 0]
			};
			p = d[e];
			return [p[0] + j, p[1] + g]
		},
		anchorTo : function (b, h, c, a, k, l) {
			var i = this,
			e = i.dom,
			j = !Ext.isEmpty(k),
			d = function () {
				Ext.fly(e).alignTo(b, h, c, a);
				Ext.callback(l, Ext.fly(e))
			},
			g = this.getAnchor();
			this.removeAnchor();
			Ext.apply(g, {
					fn : d,
					scroll : j
				});
			Ext.EventManager.onWindowResize(d, null);
			if (j) {
				Ext.EventManager.on(window, "scroll", d, null, {
						buffer : !isNaN(k) ? k : 50
					})
			}
			d.call(i);
			return i
		},
		removeAnchor : function () {
			var b = this,
			a = this.getAnchor();
			if (a && a.fn) {
				Ext.EventManager.removeResizeListener(a.fn);
				if (a.scroll) {
					Ext.EventManager.un(window, "scroll", a.fn)
				}
				delete a.fn
			}
			return b
		},
		getAnchor : function () {
			var b = Ext.Element.data,
			c = this.dom;
			if (!c) {
				return
			}
			var a = b(c, "_anchor");
			if (!a) {
				a = b(c, "_anchor", {})
			}
			return a
		},
		getAlignToXY : function (g, A, B) {
			g = Ext.get(g);
			if (!g || !g.dom) {
				throw "Element.alignToXY with an element that doesn't exist"
			}
			B = B || [0, 0];
			A = (!A || A == "?" ? "tl-bl?" : (!(/-/).test(A) && A !== "" ? "tl-" + A : A || "tl-bl")).toLowerCase();
			var K = this,
			H = K.dom,
			M,
			L,
			n,
			l,
			s,
			F,
			v,
			t = Ext.lib.Dom.getViewWidth() - 10,
			G = Ext.lib.Dom.getViewHeight() - 10,
			b,
			i,
			j,
			k,
			u,
			z,
			N = document,
			J = N.documentElement,
			q = N.body,
			E = (J.scrollLeft || q.scrollLeft || 0) + 5,
			D = (J.scrollTop || q.scrollTop || 0) + 5,
			I = false,
			e = "",
			a = "",
			C = A.match(/^([a-z]+)-([a-z]+)(\?)?$/);
			if (!C) {
				throw "Element.alignTo with an invalid alignment " + A
			}
			e = C[1];
			a = C[2];
			I = !!C[3];
			M = K.getAnchorXY(e, true);
			L = g.getAnchorXY(a, false);
			n = L[0] - M[0] + B[0];
			l = L[1] - M[1] + B[1];
			if (I) {
				s = K.getWidth();
				F = K.getHeight();
				v = g.getRegion();
				b = e.charAt(0);
				i = e.charAt(e.length - 1);
				j = a.charAt(0);
				k = a.charAt(a.length - 1);
				u = ((b == "t" && j == "b") || (b == "b" && j == "t"));
				z = ((i == "r" && k == "l") || (i == "l" && k == "r"));
				if (n + s > t + E) {
					n = z ? v.left - s : t + E - s
				}
				if (n < E) {
					n = z ? v.right : E
				}
				if (l + F > G + D) {
					l = u ? v.top - F : G + D - F
				}
				if (l < D) {
					l = u ? v.bottom : D
				}
			}
			return [n, l]
		},
		alignTo : function (c, a, e, b) {
			var d = this;
			return d.setXY(d.getAlignToXY(c, a, e), d.preanim && !!b ? d.preanim(arguments, 3) : false)
		},
		adjustForConstraints : function (c, a, b) {
			return this.getConstrainToXY(a || document, false, b, c) || c
		},
		getConstrainToXY : function (b, a, c, e) {
			var d = {
				top : 0,
				left : 0,
				bottom : 0,
				right : 0
			};
			return function (i, A, l, n) {
				i = Ext.get(i);
				l = l ? Ext.applyIf(l, d) : d;
				var z,
				D,
				v = 0,
				u = 0;
				if (i.dom == document.body || i.dom == document) {
					z = Ext.lib.Dom.getViewWidth();
					D = Ext.lib.Dom.getViewHeight()
				} else {
					z = i.dom.clientWidth;
					D = i.dom.clientHeight;
					if (!A) {
						var t = i.getXY();
						v = t[0];
						u = t[1]
					}
				}
				var r = i.getScroll();
				v += l.left + r.left;
				u += l.top + r.top;
				z -= l.right;
				D -= l.bottom;
				var B = v + z,
				g = u + D,
				j = n || (!A ? this.getXY() : [this.getLeft(true), this.getTop(true)]),
				p = j[0],
				o = j[1],
				k = this.getConstrainOffset(),
				q = this.dom.offsetWidth + k,
				C = this.dom.offsetHeight + k;
				var m = false;
				if ((p + q) > B) {
					p = B - q;
					m = true
				}
				if ((o + C) > g) {
					o = g - C;
					m = true
				}
				if (p < v) {
					p = v;
					m = true
				}
				if (o < u) {
					o = u;
					m = true
				}
				return m ? [p, o] : false
			}
		}
		(),
		getConstrainOffset : function () {
			return 0
		},
		getCenterXY : function () {
			return this.getAlignToXY(document, "c-c")
		},
		center : function (a) {
			return this.alignTo(a || document, "c-c")
		}
	});
Ext.Element.addMethods({
		select : function (a, b) {
			return Ext.Element.select(a, b, this.dom)
		}
	});
Ext.apply(Ext.Element.prototype, function () {
		var c = Ext.getDom,
		a = Ext.get,
		b = Ext.DomHelper;
		return {
			insertSibling : function (i, g, h) {
				var j = this,
				e,
				d = (g || "before").toLowerCase() == "after",
				k;
				if (Ext.isArray(i)) {
					k = j;
					Ext.each(i, function (l) {
							e = Ext.fly(k, "_internal").insertSibling(l, g, h);
							if (d) {
								k = e
							}
						});
					return e
				}
				i = i || {};
				if (i.nodeType || i.dom) {
					e = j.dom.parentNode.insertBefore(c(i), d ? j.dom.nextSibling : j.dom);
					if (!h) {
						e = a(e)
					}
				} else {
					if (d && !j.dom.nextSibling) {
						e = b.append(j.dom.parentNode, i, !h)
					} else {
						e = b[d ? "insertAfter" : "insertBefore"](j.dom, i, !h)
					}
				}
				return e
			}
		}
	}
	());
Ext.Element.boxMarkup = '<div class="{0}-tl"><div class="{0}-tr"><div class="{0}-tc"></div></div></div><div class="{0}-ml"><div class="{0}-mr"><div class="{0}-mc"></div></div></div><div class="{0}-bl"><div class="{0}-br"><div class="{0}-bc"></div></div></div>';
Ext.Element.addMethods(function () {
		var a = "_internal",
		b = /(\d+\.?\d+)px/;
		return {
			applyStyles : function (c) {
				Ext.DomHelper.applyStyles(this.dom, c);
				return this
			},
			getStyles : function () {
				var c = {};
				Ext.each(arguments, function (d) {
						c[d] = this.getStyle(d)
					}, this);
				return c
			},
			setOverflow : function (c) {
				var d = this.dom;
				if (c == "auto" && Ext.isMac && Ext.isGecko2) {
					d.style.overflow = "hidden";
					(function () {
							d.style.overflow = "auto"
						}).defer(1)
				} else {
					d.style.overflow = c
				}
			},
			boxWrap : function (c) {
				c = c || "x-box";
				var d = Ext.get(this.insertHtml("beforeBegin", "<div class='" + c + "'>" + String.format(Ext.Element.boxMarkup, c) + "</div>"));
				Ext.DomQuery.selectNode("." + c + "-mc", d.dom).appendChild(this.dom);
				return d
			},
			setSize : function (e, c, d) {
				var g = this;
				if (typeof e == "object") {
					c = e.height;
					e = e.width
				}
				e = g.adjustWidth(e);
				c = g.adjustHeight(c);
				if (!d || !g.anim) {
					g.dom.style.width = g.addUnits(e);
					g.dom.style.height = g.addUnits(c)
				} else {
					g.anim({
							width : {
								to : e
							},
							height : {
								to : c
							}
						}, g.preanim(arguments, 2))
				}
				return g
			},
			getComputedHeight : function () {
				var d = this,
				c = Math.max(d.dom.offsetHeight, d.dom.clientHeight);
				if (!c) {
					c = parseFloat(d.getStyle("height")) || 0;
					if (!d.isBorderBox()) {
						c += d.getFrameWidth("tb")
					}
				}
				return c
			},
			getComputedWidth : function () {
				var c = Math.max(this.dom.offsetWidth, this.dom.clientWidth);
				if (!c) {
					c = parseFloat(this.getStyle("width")) || 0;
					if (!this.isBorderBox()) {
						c += this.getFrameWidth("lr")
					}
				}
				return c
			},
			getFrameWidth : function (d, c) {
				return c && this.isBorderBox() ? 0 : (this.getPadding(d) + this.getBorderWidth(d))
			},
			addClassOnOver : function (c) {
				this.hover(function () {
						Ext.fly(this, a).addClass(c)
					}, function () {
						Ext.fly(this, a).removeClass(c)
					});
				return this
			},
			addClassOnFocus : function (c) {
				this.on("focus", function () {
						Ext.fly(this, a).addClass(c)
					}, this.dom);
				this.on("blur", function () {
						Ext.fly(this, a).removeClass(c)
					}, this.dom);
				return this
			},
			addClassOnClick : function (c) {
				var d = this.dom;
				this.on("mousedown", function () {
						Ext.fly(d, a).addClass(c);
						var g = Ext.getDoc(),
						e = function () {
							Ext.fly(d, a).removeClass(c);
							g.removeListener("mouseup", e)
						};
						g.on("mouseup", e)
					});
				return this
			},
			getViewSize : function () {
				var g = document,
				h = this.dom,
				c = (h == g || h == g.body);
				if (c) {
					var e = Ext.lib.Dom;
					return {
						width : e.getViewWidth(),
						height : e.getViewHeight()
					}
				} else {
					return {
						width : h.clientWidth,
						height : h.clientHeight
					}
				}
			},
			getStyleSize : function () {
				var j = this,
				c,
				i,
				l = document,
				m = this.dom,
				e = (m == l || m == l.body),
				g = m.style;
				if (e) {
					var k = Ext.lib.Dom;
					return {
						width : k.getViewWidth(),
						height : k.getViewHeight()
					}
				}
				if (g.width && g.width != "auto") {
					c = parseFloat(g.width);
					if (j.isBorderBox()) {
						c -= j.getFrameWidth("lr")
					}
				}
				if (g.height && g.height != "auto") {
					i = parseFloat(g.height);
					if (j.isBorderBox()) {
						i -= j.getFrameWidth("tb")
					}
				}
				return {
					width : c || j.getWidth(true),
					height : i || j.getHeight(true)
				}
			},
			getSize : function (c) {
				return {
					width : this.getWidth(c),
					height : this.getHeight(c)
				}
			},
			repaint : function () {
				var c = this.dom;
				this.addClass("x-repaint");
				setTimeout(function () {
						Ext.fly(c).removeClass("x-repaint")
					}, 1);
				return this
			},
			unselectable : function () {
				this.dom.unselectable = "on";
				return this.swallowEvent("selectstart", true).applyStyles("-moz-user-select:none;-khtml-user-select:none;").addClass("x-unselectable")
			},
			getMargins : function (d) {
				var e = this,
				c,
				g = {
					t : "top",
					l : "left",
					r : "right",
					b : "bottom"
				},
				h = {};
				if (!d) {
					for (c in e.margins) {
						h[g[c]] = parseFloat(e.getStyle(e.margins[c])) || 0
					}
					return h
				} else {
					return e.addStyles.call(e, d, e.margins)
				}
			}
		}
	}
	());
Ext.Element.addMethods({
		setBox : function (e, g, b) {
			var d = this,
			a = e.width,
			c = e.height;
			if ((g && !d.autoBoxAdjust) && !d.isBorderBox()) {
				a -= (d.getBorderWidth("lr") + d.getPadding("lr"));
				c -= (d.getBorderWidth("tb") + d.getPadding("tb"))
			}
			d.setBounds(e.x, e.y, a, c, d.animTest.call(d, arguments, b, 2));
			return d
		},
		getBox : function (j, p) {
			var m = this,
			v,
			e,
			o,
			d = m.getBorderWidth,
			q = m.getPadding,
			g,
			a,
			u,
			n;
			if (!p) {
				v = m.getXY()
			} else {
				e = parseInt(m.getStyle("left"), 10) || 0;
				o = parseInt(m.getStyle("top"), 10) || 0;
				v = [e, o]
			}
			var c = m.dom,
			s = c.offsetWidth,
			i = c.offsetHeight,
			k;
			if (!j) {
				k = {
					x : v[0],
					y : v[1],
					0 : v[0],
					1 : v[1],
					width : s,
					height : i
				}
			} else {
				g = d.call(m, "l") + q.call(m, "l");
				a = d.call(m, "r") + q.call(m, "r");
				u = d.call(m, "t") + q.call(m, "t");
				n = d.call(m, "b") + q.call(m, "b");
				k = {
					x : v[0] + g,
					y : v[1] + u,
					0 : v[0] + g,
					1 : v[1] + u,
					width : s - (g + a),
					height : i - (u + n)
				}
			}
			k.right = k.x + k.width;
			k.bottom = k.y + k.height;
			return k
		},
		move : function (j, b, c) {
			var g = this,
			m = g.getXY(),
			k = m[0],
			i = m[1],
			d = [k - b, i],
			l = [k + b, i],
			h = [k, i - b],
			a = [k, i + b],
			e = {
				l : d,
				left : d,
				r : l,
				right : l,
				t : h,
				top : h,
				up : h,
				b : a,
				bottom : a,
				down : a
			};
			j = j.toLowerCase();
			g.moveTo(e[j][0], e[j][1], g.animTest.call(g, arguments, c, 2))
		},
		setLeftTop : function (d, c) {
			var b = this,
			a = b.dom.style;
			a.left = b.addUnits(d);
			a.top = b.addUnits(c);
			return b
		},
		getRegion : function () {
			return Ext.lib.Dom.getRegion(this.dom)
		},
		setBounds : function (b, g, d, a, c) {
			var e = this;
			if (!c || !e.anim) {
				e.setSize(d, a);
				e.setLocation(b, g)
			} else {
				e.anim({
						points : {
							to : [b, g]
						},
						width : {
							to : e.adjustWidth(d)
						},
						height : {
							to : e.adjustHeight(a)
						}
					}, e.preanim(arguments, 4), "motion")
			}
			return e
		},
		setRegion : function (b, a) {
			return this.setBounds(b.left, b.top, b.right - b.left, b.bottom - b.top, this.animTest.call(this, arguments, a, 1))
		}
	});
Ext.Element.addMethods({
		scrollTo : function (b, d, a) {
			var e = /top/i.test(b),
			c = this,
			g = c.dom,
			h;
			if (!a || !c.anim) {
				h = "scroll" + (e ? "Top" : "Left");
				g[h] = d
			} else {
				h = "scroll" + (e ? "Left" : "Top");
				c.anim({
						scroll : {
							to : e ? [g[h], d] : [d, g[h]]
						}
					}, c.preanim(arguments, 2), "scroll")
			}
			return c
		},
		scrollIntoView : function (e, i) {
			var p = Ext.getDom(e) || Ext.getBody().dom,
			h = this.dom,
			g = this.getOffsetsTo(p),
			k = g[0] + p.scrollLeft,
			u = g[1] + p.scrollTop,
			q = u + h.offsetHeight,
			d = k + h.offsetWidth,
			a = p.clientHeight,
			m = parseInt(p.scrollTop, 10),
			s = parseInt(p.scrollLeft, 10),
			j = m + a,
			n = s + p.clientWidth;
			if (h.offsetHeight > a || u < m) {
				p.scrollTop = u
			} else {
				if (q > j) {
					p.scrollTop = q - a
				}
			}
			p.scrollTop = p.scrollTop;
			if (i !== false) {
				if (h.offsetWidth > p.clientWidth || k < s) {
					p.scrollLeft = k
				} else {
					if (d > n) {
						p.scrollLeft = d - p.clientWidth
					}
				}
				p.scrollLeft = p.scrollLeft
			}
			return this
		},
		scrollChildIntoView : function (b, a) {
			Ext.fly(b, "_scrollChildIntoView").scrollIntoView(this, a)
		},
		scroll : function (m, b, d) {
			if (!this.isScrollable()) {
				return false
			}
			var e = this.dom,
			g = e.scrollLeft,
			p = e.scrollTop,
			n = e.scrollWidth,
			k = e.scrollHeight,
			i = e.clientWidth,
			a = e.clientHeight,
			c = false,
			o,
			j = {
				l : Math.min(g + b, n - i),
				r : o = Math.max(g - b, 0),
				t : Math.max(p - b, 0),
				b : Math.min(p + b, k - a)
			};
			j.d = j.b;
			j.u = j.t;
			m = m.substr(0, 1);
			if ((o = j[m]) > -1) {
				c = true;
				this.scrollTo(m == "l" || m == "r" ? "left" : "top", o, this.preanim(arguments, 2))
			}
			return c
		}
	});
Ext.Element.addMethods(function () {
		var d = "visibility",
		b = "display",
		a = "hidden",
		h = "none",
		c = "x-masked",
		g = "x-masked-relative",
		e = Ext.Element.data;
		return {
			isVisible : function (i) {
				var j = !this.isStyle(d, a) && !this.isStyle(b, h),
				k = this.dom.parentNode;
				if (i !== true || !j) {
					return j
				}
				while (k && !(/^body/i.test(k.tagName))) {
					if (!Ext.fly(k, "_isVisible").isVisible()) {
						return false
					}
					k = k.parentNode
				}
				return true
			},
			isDisplayed : function () {
				return !this.isStyle(b, h)
			},
			enableDisplayMode : function (i) {
				this.setVisibilityMode(Ext.Element.DISPLAY);
				if (!Ext.isEmpty(i)) {
					e(this.dom, "originalDisplay", i)
				}
				return this
			},
			mask : function (j, n) {
				var p = this,
				l = p.dom,
				o = Ext.DomHelper,
				m = "ext-el-mask-msg",
				i,
				q;
				if (!/^body/i.test(l.tagName) && p.getStyle("position") == "static") {
					p.addClass(g)
				}
				if (i = e(l, "maskMsg")) {
					i.remove()
				}
				if (i = e(l, "mask")) {
					i.remove()
				}
				q = o.append(l, {
							cls : "ext-el-mask"
						}, true);
				e(l, "mask", q);
				p.addClass(c);
				q.setDisplayed(true);
				if (typeof j == "string") {
					var k = o.append(l, {
								cls : m,
								cn : {
									tag : "div"
								}
							}, true);
					e(l, "maskMsg", k);
					k.dom.className = n ? m + " " + n : m;
					k.dom.firstChild.innerHTML = j;
					k.setDisplayed(true);
					k.center(p)
				}
				if (Ext.isIE && !(Ext.isIE7 && Ext.isStrict) && p.getStyle("height") == "auto") {
					q.setSize(undefined, p.getHeight())
				}
				return q
			},
			unmask : function () {
				var k = this,
				l = k.dom,
				i = e(l, "mask"),
				j = e(l, "maskMsg");
				if (i) {
					if (j) {
						j.remove();
						e(l, "maskMsg", undefined)
					}
					i.remove();
					e(l, "mask", undefined);
					k.removeClass([c, g])
				}
			},
			isMasked : function () {
				var i = e(this.dom, "mask");
				return i && i.isVisible()
			},
			createShim : function () {
				var i = document.createElement("iframe"),
				j;
				i.frameBorder = "0";
				i.className = "ext-shim";
				i.src = Ext.SSL_SECURE_URL;
				j = Ext.get(this.dom.parentNode.insertBefore(i, this.dom));
				j.autoBoxAdjust = false;
				return j
			}
		}
	}
	());
Ext.Element.addMethods({
		addKeyListener : function (b, d, c) {
			var a;
			if (typeof b != "object" || Ext.isArray(b)) {
				a = {
					key : b,
					fn : d,
					scope : c
				}
			} else {
				a = {
					key : b.key,
					shift : b.shift,
					ctrl : b.ctrl,
					alt : b.alt,
					fn : d,
					scope : c
				}
			}
			return new Ext.KeyMap(this, a)
		},
		addKeyMap : function (a) {
			return new Ext.KeyMap(this, a)
		}
	});
Ext.CompositeElementLite.importElementMethods();
Ext.apply(Ext.CompositeElementLite.prototype, {
		addElements : function (c, a) {
			if (!c) {
				return this
			}
			if (typeof c == "string") {
				c = Ext.Element.selectorFunction(c, a)
			}
			var b = this.elements;
			Ext.each(c, function (d) {
					b.push(Ext.get(d))
				});
			return this
		},
		first : function () {
			return this.item(0)
		},
		last : function () {
			return this.item(this.getCount() - 1)
		},
		contains : function (a) {
			return this.indexOf(a) != -1
		},
		removeElement : function (d, e) {
			var c = this,
			a = this.elements,
			b;
			Ext.each(d, function (g) {
					if ((b = (a[g] || a[g = c.indexOf(g)]))) {
						if (e) {
							if (b.dom) {
								b.remove()
							} else {
								Ext.removeNode(b)
							}
						}
						a.splice(g, 1)
					}
				});
			return this
		}
	});
Ext.CompositeElement = Ext.extend(Ext.CompositeElementLite, {
			constructor : function (b, a) {
				this.elements = [];
				this.add(b, a)
			},
			getElement : function (a) {
				return a
			},
			transformElement : function (a) {
				return Ext.get(a)
			}
		});
Ext.Element.select = function (a, d, b) {
	var c;
	if (typeof a == "string") {
		c = Ext.Element.selectorFunction(a, b)
	} else {
		if (a.length !== undefined) {
			c = a
		} else {
			throw "Invalid selector"
		}
	}
	return (d === true) ? new Ext.CompositeElement(c) : new Ext.CompositeElementLite(c)
};
Ext.select = Ext.Element.select;
Ext.UpdateManager = Ext.Updater = Ext.extend(Ext.util.Observable, function () {
			var b = "beforeupdate",
			d = "update",
			c = "failure";
			function a(h) {
				var i = this;
				i.transaction = null;
				if (h.argument.form && h.argument.reset) {
					try {
						h.argument.form.reset()
					} catch (j) {}
					
				}
				if (i.loadScripts) {
					i.renderer.render(i.el, h, i, g.createDelegate(i, [h]))
				} else {
					i.renderer.render(i.el, h, i);
					g.call(i, h)
				}
			}
			function g(h, i, j) {
				this.fireEvent(i || d, this.el, h);
				if (Ext.isFunction(h.argument.callback)) {
					h.argument.callback.call(h.argument.scope, this.el, Ext.isEmpty(j) ? true : false, h, h.argument.options)
				}
			}
			function e(h) {
				g.call(this, h, c, !!(this.transaction = null))
			}
			return {
				constructor : function (i, h) {
					var j = this;
					i = Ext.get(i);
					if (!h && i.updateManager) {
						return i.updateManager
					}
					j.el = i;
					j.defaultUrl = null;
					j.addEvents(b, d, c);
					Ext.apply(j, Ext.Updater.defaults);
					j.transaction = null;
					j.refreshDelegate = j.refresh.createDelegate(j);
					j.updateDelegate = j.update.createDelegate(j);
					j.formUpdateDelegate = (j.formUpdate || function () {}).createDelegate(j);
					j.renderer = j.renderer || j.getDefaultRenderer();
					Ext.Updater.superclass.constructor.call(j)
				},
				setRenderer : function (h) {
					this.renderer = h
				},
				getRenderer : function () {
					return this.renderer
				},
				getDefaultRenderer : function () {
					return new Ext.Updater.BasicRenderer()
				},
				setDefaultUrl : function (h) {
					this.defaultUrl = h
				},
				getEl : function () {
					return this.el
				},
				update : function (i, n, p, l) {
					var k = this,
					h,
					j;
					if (k.fireEvent(b, k.el, i, n) !== false) {
						if (Ext.isObject(i)) {
							h = i;
							i = h.url;
							n = n || h.params;
							p = p || h.callback;
							l = l || h.discardUrl;
							j = h.scope;
							if (!Ext.isEmpty(h.nocache)) {
								k.disableCaching = h.nocache
							}
							if (!Ext.isEmpty(h.text)) {
								k.indicatorText = '<div class="loading-indicator">' + h.text + "</div>"
							}
							if (!Ext.isEmpty(h.scripts)) {
								k.loadScripts = h.scripts
							}
							if (!Ext.isEmpty(h.timeout)) {
								k.timeout = h.timeout
							}
						}
						k.showLoading();
						if (!l) {
							k.defaultUrl = i
						}
						if (Ext.isFunction(i)) {
							i = i.call(k)
						}
						var m = Ext.apply({}, {
									url : i,
									params : (Ext.isFunction(n) && j) ? n.createDelegate(j) : n,
									success : a,
									failure : e,
									scope : k,
									callback : undefined,
									timeout : (k.timeout * 1000),
									disableCaching : k.disableCaching,
									argument : {
										options : h,
										url : i,
										form : null,
										callback : p,
										scope : j || window,
										params : n
									}
								}, h);
						k.transaction = Ext.Ajax.request(m)
					}
				},
				formUpdate : function (k, h, j, l) {
					var i = this;
					if (i.fireEvent(b, i.el, k, h) !== false) {
						if (Ext.isFunction(h)) {
							h = h.call(i)
						}
						k = Ext.getDom(k);
						i.transaction = Ext.Ajax.request({
									form : k,
									url : h,
									success : a,
									failure : e,
									scope : i,
									timeout : (i.timeout * 1000),
									argument : {
										url : h,
										form : k,
										callback : l,
										reset : j
									}
								});
						i.showLoading.defer(1, i)
					}
				},
				startAutoRefresh : function (i, j, l, m, h) {
					var k = this;
					if (h) {
						k.update(j || k.defaultUrl, l, m, true)
					}
					if (k.autoRefreshProcId) {
						clearInterval(k.autoRefreshProcId)
					}
					k.autoRefreshProcId = setInterval(k.update.createDelegate(k, [j || k.defaultUrl, l, m, true]), i * 1000)
				},
				stopAutoRefresh : function () {
					if (this.autoRefreshProcId) {
						clearInterval(this.autoRefreshProcId);
						delete this.autoRefreshProcId
					}
				},
				isAutoRefreshing : function () {
					return !!this.autoRefreshProcId
				},
				showLoading : function () {
					if (this.showLoadIndicator) {
						this.el.dom.innerHTML = this.indicatorText
					}
				},
				abort : function () {
					if (this.transaction) {
						Ext.Ajax.abort(this.transaction)
					}
				},
				isUpdating : function () {
					return this.transaction ? Ext.Ajax.isLoading(this.transaction) : false
				},
				refresh : function (h) {
					if (this.defaultUrl) {
						this.update(this.defaultUrl, null, h, true)
					}
				}
			}
		}
		());
Ext.Updater.defaults = {
	timeout : 30,
	disableCaching : false,
	showLoadIndicator : true,
	indicatorText : '<div class="loading-indicator">Loading...</div>',
	loadScripts : false,
	sslBlankUrl : Ext.SSL_SECURE_URL
};
Ext.Updater.updateElement = function (d, c, e, b) {
	var a = Ext.get(d).getUpdater();
	Ext.apply(a, b);
	a.update(c, e, b ? b.callback : null)
};
Ext.Updater.BasicRenderer = function () {};
Ext.Updater.BasicRenderer.prototype = {
	render : function (c, a, b, d) {
		c.update(a.responseText, b.loadScripts, d)
	}
};
(function () {
		Date.useStrict = false;
		function b(d) {
			var c = Array.prototype.slice.call(arguments, 1);
			return d.replace(/\{(\d+)\}/g, function (e, g) {
					return c[g]
				})
		}
		Date.formatCodeToRegex = function (d, c) {
			var e = Date.parseCodes[d];
			if (e) {
				e = typeof e == "function" ? e() : e;
				Date.parseCodes[d] = e
			}
			return e ? Ext.applyIf({
					c : e.c ? b(e.c, c || "{0}") : e.c
				}, e) : {
				g : 0,
				c : null,
				s : Ext.escapeRe(d)
			}
		};
		var a = Date.formatCodeToRegex;
		Ext.apply(Date, {
				parseFunctions : {
					"M$" : function (d, c) {
						var e = new RegExp("\\/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\/");
						var g = (d || "").match(e);
						return g ? new Date(((g[1] || "") + g[2]) * 1) : null
					}
				},
				parseRegexes : [],
				formatFunctions : {
					"M$" : function () {
						return "\\/Date(" + this.getTime() + ")\\/"
					}
				},
				y2kYear : 50,
				MILLI : "ms",
				SECOND : "s",
				MINUTE : "mi",
				HOUR : "h",
				DAY : "d",
				MONTH : "mo",
				YEAR : "y",
				defaults : {},
				dayNames : ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
				monthNames : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
				monthNumbers : {
					Jan : 0,
					Feb : 1,
					Mar : 2,
					Apr : 3,
					May : 4,
					Jun : 5,
					Jul : 6,
					Aug : 7,
					Sep : 8,
					Oct : 9,
					Nov : 10,
					Dec : 11
				},
				getShortMonthName : function (c) {
					return Date.monthNames[c].substring(0, 3)
				},
				getShortDayName : function (c) {
					return Date.dayNames[c].substring(0, 3)
				},
				getMonthNumber : function (c) {
					return Date.monthNumbers[c.substring(0, 1).toUpperCase() + c.substring(1, 3).toLowerCase()]
				},
				formatContainsHourInfo : (function () {
						var d = /(\\.)/g,
						c = /([gGhHisucUOPZ]|M\$)/;
						return function (e) {
							return c.test(e.replace(d, ""))
						}
					})(),
				formatCodes : {
					d : "String.leftPad(this.getDate(), 2, '0')",
					D : "Date.getShortDayName(this.getDay())",
					j : "this.getDate()",
					l : "Date.dayNames[this.getDay()]",
					N : "(this.getDay() ? this.getDay() : 7)",
					S : "this.getSuffix()",
					w : "this.getDay()",
					z : "this.getDayOfYear()",
					W : "String.leftPad(this.getWeekOfYear(), 2, '0')",
					F : "Date.monthNames[this.getMonth()]",
					m : "String.leftPad(this.getMonth() + 1, 2, '0')",
					M : "Date.getShortMonthName(this.getMonth())",
					n : "(this.getMonth() + 1)",
					t : "this.getDaysInMonth()",
					L : "(this.isLeapYear() ? 1 : 0)",
					o : "(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -1 : 0)))",
					Y : "String.leftPad(this.getFullYear(), 4, '0')",
					y : "('' + this.getFullYear()).substring(2, 4)",
					a : "(this.getHours() < 12 ? 'am' : 'pm')",
					A : "(this.getHours() < 12 ? 'AM' : 'PM')",
					g : "((this.getHours() % 12) ? this.getHours() % 12 : 12)",
					G : "this.getHours()",
					h : "String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",
					H : "String.leftPad(this.getHours(), 2, '0')",
					i : "String.leftPad(this.getMinutes(), 2, '0')",
					s : "String.leftPad(this.getSeconds(), 2, '0')",
					u : "String.leftPad(this.getMilliseconds(), 3, '0')",
					O : "this.getGMTOffset()",
					P : "this.getGMTOffset(true)",
					T : "this.getTimezone()",
					Z : "(this.getTimezoneOffset() * -60)",
					c : function () {
						for (var k = "Y-m-dTH:i:sP", h = [], g = 0, d = k.length; g < d; ++g) {
							var j = k.charAt(g);
							h.push(j == "T" ? "'T'" : Date.getFormatCode(j))
						}
						return h.join(" + ")
					},
					U : "Math.round(this.getTime() / 1000)"
				},
				isValid : function (o, c, n, k, g, j, e) {
					k = k || 0;
					g = g || 0;
					j = j || 0;
					e = e || 0;
					var l = new Date(o < 100 ? 100 : o, c - 1, n, k, g, j, e).add(Date.YEAR, o < 100 ? o - 100 : 0);
					return o == l.getFullYear() && c == l.getMonth() + 1 && n == l.getDate() && k == l.getHours() && g == l.getMinutes() && j == l.getSeconds() && e == l.getMilliseconds()
				},
				parseDate : function (d, g, c) {
					var e = Date.parseFunctions;
					if (e[g] == null) {
						Date.createParser(g)
					}
					return e[g](d, Ext.isDefined(c) ? c : Date.useStrict)
				},
				getFormatCode : function (d) {
					var c = Date.formatCodes[d];
					if (c) {
						c = typeof c == "function" ? c() : c;
						Date.formatCodes[d] = c
					}
					return c || ("'" + String.escape(d) + "'")
				},
				createFormat : function (h) {
					var g = [],
					c = false,
					e = "";
					for (var d = 0; d < h.length; ++d) {
						e = h.charAt(d);
						if (!c && e == "\\") {
							c = true
						} else {
							if (c) {
								c = false;
								g.push("'" + String.escape(e) + "'")
							} else {
								g.push(Date.getFormatCode(e))
							}
						}
					}
					Date.formatFunctions[h] = new Function("return " + g.join("+"))
				},
				createParser : function () {
					var c = ["var dt, y, m, d, h, i, s, ms, o, z, zz, u, v,", "def = Date.defaults,", "results = String(input).match(Date.parseRegexes[{0}]);", "if(results){", "{1}", "if(u != null){", "v = new Date(u * 1000);", "}else{", "dt = (new Date()).clearTime();", "y = Ext.num(y, Ext.num(def.y, dt.getFullYear()));", "m = Ext.num(m, Ext.num(def.m - 1, dt.getMonth()));", "d = Ext.num(d, Ext.num(def.d, dt.getDate()));", "h  = Ext.num(h, Ext.num(def.h, dt.getHours()));", "i  = Ext.num(i, Ext.num(def.i, dt.getMinutes()));", "s  = Ext.num(s, Ext.num(def.s, dt.getSeconds()));", "ms = Ext.num(ms, Ext.num(def.ms, dt.getMilliseconds()));", "if(z >= 0 && y >= 0){", "v = new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);", "v = !strict? v : (strict === true && (z <= 364 || (v.isLeapYear() && z <= 365))? v.add(Date.DAY, z) : null);", "}else if(strict === true && !Date.isValid(y, m + 1, d, h, i, s, ms)){", "v = null;", "}else{", "v = new Date(y < 100 ? 100 : y, m, d, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);", "}", "}", "}", "if(v){", "if(zz != null){", "v = v.add(Date.SECOND, -v.getTimezoneOffset() * 60 - zz);", "}else if(o){", "v = v.add(Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));", "}", "}", "return v;"].join("\n");
					return function (m) {
						var e = Date.parseRegexes.length,
						o = 1,
						g = [],
						l = [],
						k = false,
						d = "",
						j = 0,
						h,
						n;
						for (; j < m.length; ++j) {
							d = m.charAt(j);
							if (!k && d == "\\") {
								k = true
							} else {
								if (k) {
									k = false;
									l.push(String.escape(d))
								} else {
									h = a(d, o);
									o += h.g;
									l.push(h.s);
									if (h.g && h.c) {
										if (h.calcLast) {
											n = h.c
										} else {
											g.push(h.c)
										}
									}
								}
							}
						}
						if (n) {
							g.push(n)
						}
						Date.parseRegexes[e] = new RegExp("^" + l.join("") + "$", "i");
						Date.parseFunctions[m] = new Function("input", "strict", b(c, e, g.join("")))
					}
				}
				(),
				parseCodes : {
					d : {
						g : 1,
						c : "d = parseInt(results[{0}], 10);\n",
						s : "(\\d{2})"
					},
					j : {
						g : 1,
						c : "d = parseInt(results[{0}], 10);\n",
						s : "(\\d{1,2})"
					},
					D : function () {
						for (var c = [], d = 0; d < 7; c.push(Date.getShortDayName(d)), ++d) {}
						
						return {
							g : 0,
							c : null,
							s : "(?:" + c.join("|") + ")"
						}
					},
					l : function () {
						return {
							g : 0,
							c : null,
							s : "(?:" + Date.dayNames.join("|") + ")"
						}
					},
					N : {
						g : 0,
						c : null,
						s : "[1-7]"
					},
					S : {
						g : 0,
						c : null,
						s : "(?:st|nd|rd|th)"
					},
					w : {
						g : 0,
						c : null,
						s : "[0-6]"
					},
					z : {
						g : 1,
						c : "z = parseInt(results[{0}], 10);\n",
						s : "(\\d{1,3})"
					},
					W : {
						g : 0,
						c : null,
						s : "(?:\\d{2})"
					},
					F : function () {
						return {
							g : 1,
							c : "m = parseInt(Date.getMonthNumber(results[{0}]), 10);\n",
							s : "(" + Date.monthNames.join("|") + ")"
						}
					},
					M : function () {
						for (var c = [], d = 0; d < 12; c.push(Date.getShortMonthName(d)), ++d) {}
						
						return Ext.applyIf({
								s : "(" + c.join("|") + ")"
							}, a("F"))
					},
					m : {
						g : 1,
						c : "m = parseInt(results[{0}], 10) - 1;\n",
						s : "(\\d{2})"
					},
					n : {
						g : 1,
						c : "m = parseInt(results[{0}], 10) - 1;\n",
						s : "(\\d{1,2})"
					},
					t : {
						g : 0,
						c : null,
						s : "(?:\\d{2})"
					},
					L : {
						g : 0,
						c : null,
						s : "(?:1|0)"
					},
					o : function () {
						return a("Y")
					},
					Y : {
						g : 1,
						c : "y = parseInt(results[{0}], 10);\n",
						s : "(\\d{4})"
					},
					y : {
						g : 1,
						c : "var ty = parseInt(results[{0}], 10);\ny = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",
						s : "(\\d{1,2})"
					},
					a : function () {
						return a("A")
					},
					A : {
						calcLast : true,
						g : 1,
						c : "if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",
						s : "(AM|PM|am|pm)"
					},
					g : function () {
						return a("G")
					},
					G : {
						g : 1,
						c : "h = parseInt(results[{0}], 10);\n",
						s : "(\\d{1,2})"
					},
					h : function () {
						return a("H")
					},
					H : {
						g : 1,
						c : "h = parseInt(results[{0}], 10);\n",
						s : "(\\d{2})"
					},
					i : {
						g : 1,
						c : "i = parseInt(results[{0}], 10);\n",
						s : "(\\d{2})"
					},
					s : {
						g : 1,
						c : "s = parseInt(results[{0}], 10);\n",
						s : "(\\d{2})"
					},
					u : {
						g : 1,
						c : "ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",
						s : "(\\d+)"
					},
					O : {
						g : 1,
						c : ["o = results[{0}];", "var sn = o.substring(0,1),", "hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),", "mn = o.substring(3,5) % 60;", "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),
						s : "([+-]\\d{4})"
					},
					P : {
						g : 1,
						c : ["o = results[{0}];", "var sn = o.substring(0,1),", "hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),", "mn = o.substring(4,6) % 60;", "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),
						s : "([+-]\\d{2}:\\d{2})"
					},
					T : {
						g : 0,
						c : null,
						s : "[A-Z]{1,4}"
					},
					Z : {
						g : 1,
						c : "zz = results[{0}] * 1;\nzz = (-43200 <= zz && zz <= 50400)? zz : null;\n",
						s : "([+-]?\\d{1,5})"
					},
					c : function () {
						var e = [],
						c = [a("Y", 1), a("m", 2), a("d", 3), a("h", 4), a("i", 5), a("s", 6), {
								c : "ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"
							}, {
								c : ["if(results[8]) {", "if(results[8] == 'Z'){", "zz = 0;", "}else if (results[8].indexOf(':') > -1){", a("P", 8).c, "}else{", a("O", 8).c, "}", "}"].join("\n")
							}
						];
						for (var g = 0, d = c.length; g < d; ++g) {
							e.push(c[g].c)
						}
						return {
							g : 1,
							c : e.join(""),
							s : [c[0].s, "(?:", "-", c[1].s, "(?:", "-", c[2].s, "(?:", "(?:T| )?", c[3].s, ":", c[4].s, "(?::", c[5].s, ")?", "(?:(?:\\.|,)(\\d+))?", "(Z|(?:[-+]\\d{2}(?::)?\\d{2}))?", ")?", ")?", ")?"].join("")
						}
					},
					U : {
						g : 1,
						c : "u = parseInt(results[{0}], 10);\n",
						s : "(-?\\d+)"
					}
				}
			})
	}
	());
Ext.apply(Date.prototype, {
		dateFormat : function (a) {
			if (Date.formatFunctions[a] == null) {
				Date.createFormat(a)
			}
			return Date.formatFunctions[a].call(this)
		},
		getTimezone : function () {
			return this.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, "")
		},
		getGMTOffset : function (a) {
			return (this.getTimezoneOffset() > 0 ? "-" : "+") + String.leftPad(Math.floor(Math.abs(this.getTimezoneOffset()) / 60), 2, "0") + (a ? ":" : "") + String.leftPad(Math.abs(this.getTimezoneOffset() % 60), 2, "0")
		},
		getDayOfYear : function () {
			var b = 0,
			e = this.clone(),
			a = this.getMonth(),
			c;
			for (c = 0, e.setDate(1), e.setMonth(0); c < a; e.setMonth(++c)) {
				b += e.getDaysInMonth()
			}
			return b + this.getDate() - 1
		},
		getWeekOfYear : function () {
			var a = 86400000,
			b = 7 * a;
			return function () {
				var d = Date.UTC(this.getFullYear(), this.getMonth(), this.getDate() + 3) / a,
				c = Math.floor(d / 7),
				e = new Date(c * b).getUTCFullYear();
				return c - Math.floor(Date.UTC(e, 0, 7) / b) + 1
			}
		}
		(),
		isLeapYear : function () {
			var a = this.getFullYear();
			return !!((a & 3) == 0 && (a % 100 || (a % 400 == 0 && a)))
		},
		getFirstDayOfMonth : function () {
			var a = (this.getDay() - (this.getDate() - 1)) % 7;
			return (a < 0) ? (a + 7) : a
		},
		getLastDayOfMonth : function () {
			return this.getLastDateOfMonth().getDay()
		},
		getFirstDateOfMonth : function () {
			return new Date(this.getFullYear(), this.getMonth(), 1)
		},
		getLastDateOfMonth : function () {
			return new Date(this.getFullYear(), this.getMonth(), this.getDaysInMonth())
		},
		getDaysInMonth : function () {
			var a = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
			return function () {
				var b = this.getMonth();
				return b == 1 && this.isLeapYear() ? 29 : a[b]
			}
		}
		(),
		getSuffix : function () {
			switch (this.getDate()) {
			case 1:
			case 21:
			case 31:
				return "st";
			case 2:
			case 22:
				return "nd";
			case 3:
			case 23:
				return "rd";
			default:
				return "th"
			}
		},
		clone : function () {
			return new Date(this.getTime())
		},
		isDST : function () {
			return new Date(this.getFullYear(), 0, 1).getTimezoneOffset() != this.getTimezoneOffset()
		},
		clearTime : function (g) {
			if (g) {
				return this.clone().clearTime()
			}
			var b = this.getDate();
			this.setHours(0);
			this.setMinutes(0);
			this.setSeconds(0);
			this.setMilliseconds(0);
			if (this.getDate() != b) {
				for (var a = 1, e = this.add(Date.HOUR, a); e.getDate() != b; a++, e = this.add(Date.HOUR, a)) {}
				
				this.setDate(b);
				this.setHours(e.getHours())
			}
			return this
		},
		add : function (b, c) {
			var e = this.clone();
			if (!b || c === 0) {
				return e
			}
			switch (b.toLowerCase()) {
			case Date.MILLI:
				e.setMilliseconds(this.getMilliseconds() + c);
				break;
			case Date.SECOND:
				e.setSeconds(this.getSeconds() + c);
				break;
			case Date.MINUTE:
				e.setMinutes(this.getMinutes() + c);
				break;
			case Date.HOUR:
				e.setHours(this.getHours() + c);
				break;
			case Date.DAY:
				e.setDate(this.getDate() + c);
				break;
			case Date.MONTH:
				var a = this.getDate();
				if (a > 28) {
					a = Math.min(a, this.getFirstDateOfMonth().add("mo", c).getLastDateOfMonth().getDate())
				}
				e.setDate(a);
				e.setMonth(this.getMonth() + c);
				break;
			case Date.YEAR:
				e.setFullYear(this.getFullYear() + c);
				break
			}
			return e
		},
		between : function (c, a) {
			var b = this.getTime();
			return c.getTime() <= b && b <= a.getTime()
		}
	});
Date.prototype.format = Date.prototype.dateFormat;
if (Ext.isSafari && (navigator.userAgent.match(/WebKit\/(\d+)/)[1] || NaN) < 420) {
	Ext.apply(Date.prototype, {
			_xMonth : Date.prototype.setMonth,
			_xDate : Date.prototype.setDate,
			setMonth : function (a) {
				if (a <= -1) {
					var d = Math.ceil(-a),
					c = Math.ceil(d / 12),
					b = (d % 12) ? 12 - d % 12 : 0;
					this.setFullYear(this.getFullYear() - c);
					return this._xMonth(b)
				} else {
					return this._xMonth(a)
				}
			},
			setDate : function (a) {
				return this.setTime(this.getTime() - (this.getDate() - a) * 86400000)
			}
		})
}
Ext.util.MixedCollection = function (b, a) {
	this.items = [];
	this.map = {};
	this.keys = [];
	this.length = 0;
	this.addEvents("clear", "add", "replace", "remove", "sort");
	this.allowFunctions = b === true;
	if (a) {
		this.getKey = a
	}
	Ext.util.MixedCollection.superclass.constructor.call(this)
};
Ext.extend(Ext.util.MixedCollection, Ext.util.Observable, {
		allowFunctions : false,
		add : function (b, c) {
			if (arguments.length == 1) {
				c = arguments[0];
				b = this.getKey(c)
			}
			if (typeof b != "undefined" && b !== null) {
				var a = this.map[b];
				if (typeof a != "undefined") {
					return this.replace(b, c)
				}
				this.map[b] = c
			}
			this.length++;
			this.items.push(c);
			this.keys.push(b);
			this.fireEvent("add", this.length - 1, c, b);
			return c
		},
		getKey : function (a) {
			return a.id
		},
		replace : function (c, d) {
			if (arguments.length == 1) {
				d = arguments[0];
				c = this.getKey(d)
			}
			var a = this.map[c];
			if (typeof c == "undefined" || c === null || typeof a == "undefined") {
				return this.add(c, d)
			}
			var b = this.indexOfKey(c);
			this.items[b] = d;
			this.map[c] = d;
			this.fireEvent("replace", c, a, d);
			return d
		},
		addAll : function (e) {
			if (arguments.length > 1 || Ext.isArray(e)) {
				var b = arguments.length > 1 ? arguments : e;
				for (var d = 0, a = b.length; d < a; d++) {
					this.add(b[d])
				}
			} else {
				for (var c in e) {
					if (this.allowFunctions || typeof e[c] != "function") {
						this.add(c, e[c])
					}
				}
			}
		},
		each : function (e, d) {
			var b = [].concat(this.items);
			for (var c = 0, a = b.length; c < a; c++) {
				if (e.call(d || b[c], b[c], c, a) === false) {
					break
				}
			}
		},
		eachKey : function (d, c) {
			for (var b = 0, a = this.keys.length; b < a; b++) {
				d.call(c || window, this.keys[b], this.items[b], b, a)
			}
		},
		find : function (d, c) {
			for (var b = 0, a = this.items.length; b < a; b++) {
				if (d.call(c || window, this.items[b], this.keys[b])) {
					return this.items[b]
				}
			}
			return null
		},
		insert : function (a, b, c) {
			if (arguments.length == 2) {
				c = arguments[1];
				b = this.getKey(c)
			}
			if (this.containsKey(b)) {
				this.suspendEvents();
				this.removeKey(b);
				this.resumeEvents()
			}
			if (a >= this.length) {
				return this.add(b, c)
			}
			this.length++;
			this.items.splice(a, 0, c);
			if (typeof b != "undefined" && b !== null) {
				this.map[b] = c
			}
			this.keys.splice(a, 0, b);
			this.fireEvent("add", a, c, b);
			return c
		},
		remove : function (a) {
			return this.removeAt(this.indexOf(a))
		},
		removeAt : function (a) {
			if (a < this.length && a >= 0) {
				this.length--;
				var c = this.items[a];
				this.items.splice(a, 1);
				var b = this.keys[a];
				if (typeof b != "undefined") {
					delete this.map[b]
				}
				this.keys.splice(a, 1);
				this.fireEvent("remove", c, b);
				return c
			}
			return false
		},
		removeKey : function (a) {
			return this.removeAt(this.indexOfKey(a))
		},
		getCount : function () {
			return this.length
		},
		indexOf : function (a) {
			return this.items.indexOf(a)
		},
		indexOfKey : function (a) {
			return this.keys.indexOf(a)
		},
		item : function (b) {
			var a = this.map[b],
			c = a !== undefined ? a : (typeof b == "number") ? this.items[b] : undefined;
			return typeof c != "function" || this.allowFunctions ? c : null
		},
		itemAt : function (a) {
			return this.items[a]
		},
		key : function (a) {
			return this.map[a]
		},
		contains : function (a) {
			return this.indexOf(a) != -1
		},
		containsKey : function (a) {
			return typeof this.map[a] != "undefined"
		},
		clear : function () {
			this.length = 0;
			this.items = [];
			this.keys = [];
			this.map = {};
			this.fireEvent("clear")
		},
		first : function () {
			return this.items[0]
		},
		last : function () {
			return this.items[this.length - 1]
		},
		_sort : function (k, a, j) {
			var d,
			e,
			b = String(a).toUpperCase() == "DESC" ? -1 : 1,
			h = [],
			l = this.keys,
			g = this.items;
			j = j || function (i, c) {
				return i - c
			};
			for (d = 0, e = g.length; d < e; d++) {
				h[h.length] = {
					key : l[d],
					value : g[d],
					index : d
				}
			}
			h.sort(function (i, c) {
					var m = j(i[k], c[k]) * b;
					if (m === 0) {
						m = (i.index < c.index ? -1 : 1)
					}
					return m
				});
			for (d = 0, e = h.length; d < e; d++) {
				g[d] = h[d].value;
				l[d] = h[d].key
			}
			this.fireEvent("sort", this)
		},
		sort : function (a, b) {
			this._sort("value", a, b)
		},
		reorder : function (d) {
			this.suspendEvents();
			var b = this.items,
			c = 0,
			g = b.length,
			a = [],
			e = [],
			h;
			for (h in d) {
				a[d[h]] = b[h]
			}
			for (c = 0; c < g; c++) {
				if (d[c] == undefined) {
					e.push(b[c])
				}
			}
			for (c = 0; c < g; c++) {
				if (a[c] == undefined) {
					a[c] = e.shift()
				}
			}
			this.clear();
			this.addAll(a);
			this.resumeEvents();
			this.fireEvent("sort", this)
		},
		keySort : function (a, b) {
			this._sort("key", a, b || function (d, c) {
					var g = String(d).toUpperCase(),
					e = String(c).toUpperCase();
					return g > e ? 1 : (g < e ? -1 : 0)
				})
		},
		getRange : function (e, a) {
			var b = this.items;
			if (b.length < 1) {
				return []
			}
			e = e || 0;
			a = Math.min(typeof a == "undefined" ? this.length - 1 : a, this.length - 1);
			var c,
			d = [];
			if (e <= a) {
				for (c = e; c <= a; c++) {
					d[d.length] = b[c]
				}
			} else {
				for (c = e; c >= a; c--) {
					d[d.length] = b[c]
				}
			}
			return d
		},
		filter : function (c, b, d, a) {
			if (Ext.isEmpty(b, false)) {
				return this.clone()
			}
			b = this.createValueMatcher(b, d, a);
			return this.filterBy(function (e) {
					return e && b.test(e[c])
				})
		},
		filterBy : function (g, e) {
			var h = new Ext.util.MixedCollection();
			h.getKey = this.getKey;
			var b = this.keys,
			d = this.items;
			for (var c = 0, a = d.length; c < a; c++) {
				if (g.call(e || this, d[c], b[c])) {
					h.add(b[c], d[c])
				}
			}
			return h
		},
		findIndex : function (c, b, e, d, a) {
			if (Ext.isEmpty(b, false)) {
				return -1
			}
			b = this.createValueMatcher(b, d, a);
			return this.findIndexBy(function (g) {
					return g && b.test(g[c])
				}, null, e)
		},
		findIndexBy : function (g, e, h) {
			var b = this.keys,
			d = this.items;
			for (var c = (h || 0), a = d.length; c < a; c++) {
				if (g.call(e || this, d[c], b[c])) {
					return c
				}
			}
			return -1
		},
		createValueMatcher : function (c, e, a, b) {
			if (!c.exec) {
				var d = Ext.escapeRe;
				c = String(c);
				if (e === true) {
					c = d(c)
				} else {
					c = "^" + d(c);
					if (b === true) {
						c += "$"
					}
				}
				c = new RegExp(c, a ? "" : "i")
			}
			return c
		},
		clone : function () {
			var e = new Ext.util.MixedCollection();
			var b = this.keys,
			d = this.items;
			for (var c = 0, a = d.length; c < a; c++) {
				e.add(b[c], d[c])
			}
			e.getKey = this.getKey;
			return e
		}
	});
Ext.util.MixedCollection.prototype.get = Ext.util.MixedCollection.prototype.item;
Ext.AbstractManager = Ext.extend(Object, {
			typeName : "type",
			constructor : function (a) {
				Ext.apply(this, a || {});
				this.all = new Ext.util.MixedCollection();
				this.types = {}
				
			},
			get : function (a) {
				return this.all.get(a)
			},
			register : function (a) {
				this.all.add(a)
			},
			unregister : function (a) {
				this.all.remove(a)
			},
			registerType : function (b, a) {
				this.types[b] = a;
				a[this.typeName] = b
			},
			isRegistered : function (a) {
				return this.types[a] !== undefined
			},
			create : function (a, d) {
				var b = a[this.typeName] || a.type || d,
				c = this.types[b];
				if (c == undefined) {
					throw new Error(String.format("The '{0}' type has not been registered with this manager", b))
				}
				return new c(a)
			},
			onAvailable : function (d, c, b) {
				var a = this.all;
				a.on("add", function (e, g) {
						if (g.id == d) {
							c.call(b || g, g);
							a.un("add", c, b)
						}
					})
			}
		});
Ext.util.Format = function () {
	var trimRe = /^\s+|\s+$/g,
	stripTagsRE = /<\/?[^>]+>/gi,
	stripScriptsRe = /(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,
	nl2brRe = /\r?\n/g;
	return {
		ellipsis : function (value, len, word) {
			if (value && value.length > len) {
				if (word) {
					var vs = value.substr(0, len - 2),
					index = Math.max(vs.lastIndexOf(" "), vs.lastIndexOf("."), vs.lastIndexOf("!"), vs.lastIndexOf("?"));
					if (index == -1 || index < (len - 15)) {
						return value.substr(0, len - 3) + "..."
					} else {
						return vs.substr(0, index) + "..."
					}
				} else {
					return value.substr(0, len - 3) + "..."
				}
			}
			return value
		},
		undef : function (value) {
			return value !== undefined ? value : ""
		},
		defaultValue : function (value, defaultValue) {
			return value !== undefined && value !== "" ? value : defaultValue
		},
		htmlEncode : function (value) {
			return !value ? value : String(value).replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;")
		},
		htmlDecode : function (value) {
			return !value ? value : String(value).replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(/&quot;/g, '"').replace(/&amp;/g, "&")
		},
		trim : function (value) {
			return String(value).replace(trimRe, "")
		},
		substr : function (value, start, length) {
			return String(value).substr(start, length)
		},
		lowercase : function (value) {
			return String(value).toLowerCase()
		},
		uppercase : function (value) {
			return String(value).toUpperCase()
		},
		capitalize : function (value) {
			return !value ? value : value.charAt(0).toUpperCase() + value.substr(1).toLowerCase()
		},
		call : function (value, fn) {
			if (arguments.length > 2) {
				var args = Array.prototype.slice.call(arguments, 2);
				args.unshift(value);
				return eval(fn).apply(window, args)
			} else {
				return eval(fn).call(window, value)
			}
		},
		usMoney : function (v) {
			v = (Math.round((v - 0) * 100)) / 100;
			v = (v == Math.floor(v)) ? v + ".00" : ((v * 10 == Math.floor(v * 10)) ? v + "0" : v);
			v = String(v);
			var ps = v.split("."),
			whole = ps[0],
			sub = ps[1] ? "." + ps[1] : ".00",
			r = /(\d+)(\d{3})/;
			while (r.test(whole)) {
				whole = whole.replace(r, "$1,$2")
			}
			v = whole + sub;
			if (v.charAt(0) == "-") {
				return "-$" + v.substr(1)
			}
			return "$" + v
		},
		date : function (v, format) {
			if (!v) {
				return ""
			}
			if (!Ext.isDate(v)) {
				v = new Date(Date.parse(v))
			}
			return v.dateFormat(format || "m/d/Y")
		},
		dateRenderer : function (format) {
			return function (v) {
				return Ext.util.Format.date(v, format)
			}
		},
		stripTags : function (v) {
			return !v ? v : String(v).replace(stripTagsRE, "")
		},
		stripScripts : function (v) {
			return !v ? v : String(v).replace(stripScriptsRe, "")
		},
		fileSize : function (size) {
			if (size < 1024) {
				return size + " bytes"
			} else {
				if (size < 1048576) {
					return (Math.round(((size * 10) / 1024)) / 10) + " KB"
				} else {
					return (Math.round(((size * 10) / 1048576)) / 10) + " MB"
				}
			}
		},
		math : function () {
			var fns = {};
			return function (v, a) {
				if (!fns[a]) {
					fns[a] = new Function("v", "return v " + a + ";")
				}
				return fns[a](v)
			}
		}
		(),
		round : function (value, precision) {
			var result = Number(value);
			if (typeof precision == "number") {
				precision = Math.pow(10, precision);
				result = Math.round(value * precision) / precision
			}
			return result
		},
		number : function (v, format) {
			if (!format) {
				return v
			}
			v = Ext.num(v, NaN);
			if (isNaN(v)) {
				return ""
			}
			var comma = ",",
			dec = ".",
			i18n = false,
			neg = v < 0;
			v = Math.abs(v);
			if (format.substr(format.length - 2) == "/i") {
				format = format.substr(0, format.length - 2);
				i18n = true;
				comma = ".";
				dec = ","
			}
			var hasComma = format.indexOf(comma) != -1,
			psplit = (i18n ? format.replace(/[^\d\,]/g, "") : format.replace(/[^\d\.]/g, "")).split(dec);
			if (1 < psplit.length) {
				v = v.toFixed(psplit[1].length)
			} else {
				if (2 < psplit.length) {
					throw("NumberFormatException: invalid format, formats should have no more than 1 period: " + format)
				} else {
					v = v.toFixed(0)
				}
			}
			var fnum = v.toString();
			psplit = fnum.split(".");
			if (hasComma) {
				var cnum = psplit[0],
				parr = [],
				j = cnum.length,
				m = Math.floor(j / 3),
				n = cnum.length % 3 || 3,
				i;
				for (i = 0; i < j; i += n) {
					if (i != 0) {
						n = 3
					}
					parr[parr.length] = cnum.substr(i, n);
					m -= 1
				}
				fnum = parr.join(comma);
				if (psplit[1]) {
					fnum += dec + psplit[1]
				}
			} else {
				if (psplit[1]) {
					fnum = psplit[0] + dec + psplit[1]
				}
			}
			return (neg ? "-" : "") + format.replace(/[\d,?\.?]+/, fnum)
		},
		numberRenderer : function (format) {
			return function (v) {
				return Ext.util.Format.number(v, format)
			}
		},
		plural : function (v, s, p) {
			return v + " " + (v == 1 ? s : (p ? p : s + "s"))
		},
		nl2br : function (v) {
			return Ext.isEmpty(v) ? "" : v.replace(nl2brRe, "<br/>")
		}
	}
}
();
Ext.XTemplate = function () {
	Ext.XTemplate.superclass.constructor.apply(this, arguments);
	var y = this,
	j = y.html,
	q = /<tpl\b[^>]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/,
	d = /^<tpl\b[^>]*?for="(.*?)"/,
	v = /^<tpl\b[^>]*?if="(.*?)"/,
	x = /^<tpl\b[^>]*?exec="(.*?)"/,
	r,
	p = 0,
	k = [],
	o = "values",
	w = "parent",
	l = "xindex",
	n = "xcount",
	e = "return ",
	c = "with(values){ ";
	j = ["<tpl>", j, "</tpl>"].join("");
	while ((r = j.match(q))) {
		var b = r[0].match(d),
		a = r[0].match(v),
		A = r[0].match(x),
		g = null,
		h = null,
		t = null,
		z = b && b[1] ? b[1] : "";
		if (a) {
			g = a && a[1] ? a[1] : null;
			if (g) {
				h = new Function(o, w, l, n, c + e + (Ext.util.Format.htmlDecode(g)) + "; }")
			}
		}
		if (A) {
			g = A && A[1] ? A[1] : null;
			if (g) {
				t = new Function(o, w, l, n, c + (Ext.util.Format.htmlDecode(g)) + "; }")
			}
		}
		if (z) {
			switch (z) {
			case ".":
				z = new Function(o, w, c + e + o + "; }");
				break;
			case "..":
				z = new Function(o, w, c + e + w + "; }");
				break;
			default:
				z = new Function(o, w, c + e + z + "; }")
			}
		}
		k.push({
				id : p,
				target : z,
				exec : t,
				test : h,
				body : r[1] || ""
			});
		j = j.replace(r[0], "{xtpl" + p + "}");
		++p
	}
	for (var u = k.length - 1; u >= 0; --u) {
		y.compileTpl(k[u])
	}
	y.master = k[k.length - 1];
	y.tpls = k
};
Ext.extend(Ext.XTemplate, Ext.Template, {
		re : /\{([\w\-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g,
		codeRe : /\{\[((?:\\\]|.|\n)*?)\]\}/g,
		applySubTemplate : function (a, k, j, d, c) {
			var h = this,
			g,
			m = h.tpls[a],
			l,
			b = [];
			if ((m.test && !m.test.call(h, k, j, d, c)) || (m.exec && m.exec.call(h, k, j, d, c))) {
				return ""
			}
			l = m.target ? m.target.call(h, k, j) : k;
			g = l.length;
			j = m.target ? k : j;
			if (m.target && Ext.isArray(l)) {
				for (var e = 0, g = l.length; e < g; e++) {
					b[b.length] = m.compiled.call(h, l[e], j, e + 1, g)
				}
				return b.join("")
			}
			return m.compiled.call(h, l, j, d, c)
		},
		compileTpl : function (tpl) {
			var fm = Ext.util.Format,
			useF = this.disableFormats !== true,
			sep = Ext.isGecko ? "+" : ",",
			body;
			function fn(m, name, format, args, math) {
				if (name.substr(0, 4) == "xtpl") {
					return "'" + sep + "this.applySubTemplate(" + name.substr(4) + ", values, parent, xindex, xcount)" + sep + "'"
				}
				var v;
				if (name === ".") {
					v = "values"
				} else {
					if (name === "#") {
						v = "xindex"
					} else {
						if (name.indexOf(".") != -1) {
							v = name
						} else {
							v = "values['" + name + "']"
						}
					}
				}
				if (math) {
					v = "(" + v + math + ")"
				}
				if (format && useF) {
					args = args ? "," + args : "";
					if (format.substr(0, 5) != "this.") {
						format = "fm." + format + "("
					} else {
						format = 'this.call("' + format.substr(5) + '", ';
						args = ", values"
					}
				} else {
					args = "";
					format = "(" + v + " === undefined ? '' : "
				}
				return "'" + sep + format + v + args + ")" + sep + "'"
			}
			function codeFn(m, code) {
				return "'" + sep + "(" + code.replace(/\\'/g, "'") + ")" + sep + "'"
			}
			if (Ext.isGecko) {
				body = "tpl.compiled = function(values, parent, xindex, xcount){ return '" + tpl.body.replace(/(\r\n|\n)/g, "\\n").replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn) + "';};"
			} else {
				body = ["tpl.compiled = function(values, parent, xindex, xcount){ return ['"];
				body.push(tpl.body.replace(/(\r\n|\n)/g, "\\n").replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn));
				body.push("'].join('');};");
				body = body.join("")
			}
			eval(body);
			return this
		},
		applyTemplate : function (a) {
			return this.master.compiled.call(this, a, {}, 1, 1)
		},
		compile : function () {
			return this
		}
	});
Ext.XTemplate.prototype.apply = Ext.XTemplate.prototype.applyTemplate;
Ext.XTemplate.from = function (a) {
	a = Ext.getDom(a);
	return new Ext.XTemplate(a.value || a.innerHTML)
};
Ext.util.CSS = function () {
	var d = null;
	var c = document;
	var b = /(-[a-z])/gi;
	var a = function (e, g) {
		return g.charAt(1).toUpperCase()
	};
	return {
		createStyleSheet : function (i, l) {
			var h;
			var g = c.getElementsByTagName("head")[0];
			var k = c.createElement("style");
			k.setAttribute("type", "text/css");
			if (l) {
				k.setAttribute("id", l)
			}
			if (Ext.isIE) {
				g.appendChild(k);
				h = k.styleSheet;
				h.cssText = i
			} else {
				try {
					k.appendChild(c.createTextNode(i))
				} catch (j) {
					k.cssText = i
				}
				g.appendChild(k);
				h = k.styleSheet ? k.styleSheet : (k.sheet || c.styleSheets[c.styleSheets.length - 1])
			}
			this.cacheStyleSheet(h);
			return h
		},
		removeStyleSheet : function (g) {
			var e = c.getElementById(g);
			if (e) {
				e.parentNode.removeChild(e)
			}
		},
		swapStyleSheet : function (h, e) {
			this.removeStyleSheet(h);
			var g = c.createElement("link");
			g.setAttribute("rel", "stylesheet");
			g.setAttribute("type", "text/css");
			g.setAttribute("id", h);
			g.setAttribute("href", e);
			c.getElementsByTagName("head")[0].appendChild(g)
		},
		refreshCache : function () {
			return this.getRules(true)
		},
		cacheStyleSheet : function (h) {
			if (!d) {
				d = {}
				
			}
			try {
				var k = h.cssRules || h.rules;
				for (var g = k.length - 1; g >= 0; --g) {
					d[k[g].selectorText.toLowerCase()] = k[g]
				}
			} catch (i) {}
			
		},
		getRules : function (h) {
			if (d === null || h) {
				d = {};
				var k = c.styleSheets;
				for (var j = 0, g = k.length; j < g; j++) {
					try {
						this.cacheStyleSheet(k[j])
					} catch (l) {}
					
				}
			}
			return d
		},
		getRule : function (e, h) {
			var g = this.getRules(h);
			if (!Ext.isArray(e)) {
				return g[e.toLowerCase()]
			}
			for (var j = 0; j < e.length; j++) {
				if (g[e[j]]) {
					return g[e[j].toLowerCase()]
				}
			}
			return null
		},
		updateRule : function (e, j, h) {
			if (!Ext.isArray(e)) {
				var k = this.getRule(e);
				if (k) {
					k.style[j.replace(b, a)] = h;
					return true
				}
			} else {
				for (var g = 0; g < e.length; g++) {
					if (this.updateRule(e[g], j, h)) {
						return true
					}
				}
			}
			return false
		}
	}
}
();
Ext.util.ClickRepeater = Ext.extend(Ext.util.Observable, {
			constructor : function (b, a) {
				this.el = Ext.get(b);
				this.el.unselectable();
				Ext.apply(this, a);
				this.addEvents("mousedown", "click", "mouseup");
				if (!this.disabled) {
					this.disabled = true;
					this.enable()
				}
				if (this.handler) {
					this.on("click", this.handler, this.scope || this)
				}
				Ext.util.ClickRepeater.superclass.constructor.call(this)
			},
			interval : 20,
			delay : 250,
			preventDefault : true,
			stopDefault : false,
			timer : 0,
			enable : function () {
				if (this.disabled) {
					this.el.on("mousedown", this.handleMouseDown, this);
					if (Ext.isIE) {
						this.el.on("dblclick", this.handleDblClick, this)
					}
					if (this.preventDefault || this.stopDefault) {
						this.el.on("click", this.eventOptions, this)
					}
				}
				this.disabled = false
			},
			disable : function (a) {
				if (a || !this.disabled) {
					clearTimeout(this.timer);
					if (this.pressClass) {
						this.el.removeClass(this.pressClass)
					}
					Ext.getDoc().un("mouseup", this.handleMouseUp, this);
					this.el.removeAllListeners()
				}
				this.disabled = true
			},
			setDisabled : function (a) {
				this[a ? "disable" : "enable"]()
			},
			eventOptions : function (a) {
				if (this.preventDefault) {
					a.preventDefault()
				}
				if (this.stopDefault) {
					a.stopEvent()
				}
			},
			destroy : function () {
				this.disable(true);
				Ext.destroy(this.el);
				this.purgeListeners()
			},
			handleDblClick : function (a) {
				clearTimeout(this.timer);
				this.el.blur();
				this.fireEvent("mousedown", this, a);
				this.fireEvent("click", this, a)
			},
			handleMouseDown : function (a) {
				clearTimeout(this.timer);
				this.el.blur();
				if (this.pressClass) {
					this.el.addClass(this.pressClass)
				}
				this.mousedownTime = new Date();
				Ext.getDoc().on("mouseup", this.handleMouseUp, this);
				this.el.on("mouseout", this.handleMouseOut, this);
				this.fireEvent("mousedown", this, a);
				this.fireEvent("click", this, a);
				if (this.accelerate) {
					this.delay = 400
				}
				this.timer = this.click.defer(this.delay || this.interval, this, [a])
			},
			click : function (a) {
				this.fireEvent("click", this, a);
				this.timer = this.click.defer(this.accelerate ? this.easeOutExpo(this.mousedownTime.getElapsed(), 400, -390, 12000) : this.interval, this, [a])
			},
			easeOutExpo : function (e, a, h, g) {
				return (e == g) ? a + h : h * (-Math.pow(2, -10 * e / g) + 1) + a
			},
			handleMouseOut : function () {
				clearTimeout(this.timer);
				if (this.pressClass) {
					this.el.removeClass(this.pressClass)
				}
				this.el.on("mouseover", this.handleMouseReturn, this)
			},
			handleMouseReturn : function () {
				this.el.un("mouseover", this.handleMouseReturn, this);
				if (this.pressClass) {
					this.el.addClass(this.pressClass)
				}
				this.click()
			},
			handleMouseUp : function (a) {
				clearTimeout(this.timer);
				this.el.un("mouseover", this.handleMouseReturn, this);
				this.el.un("mouseout", this.handleMouseOut, this);
				Ext.getDoc().un("mouseup", this.handleMouseUp, this);
				this.el.removeClass(this.pressClass);
				this.fireEvent("mouseup", this, a)
			}
		});
Ext.KeyNav = function (b, a) {
	this.el = Ext.get(b);
	Ext.apply(this, a);
	if (!this.disabled) {
		this.disabled = true;
		this.enable()
	}
};
Ext.KeyNav.prototype = {
	disabled : false,
	defaultEventAction : "stopEvent",
	forceKeyDown : false,
	relay : function (c) {
		var a = c.getKey(),
		b = this.keyToHandler[a];
		if (b && this[b]) {
			if (this.doRelay(c, this[b], b) !== true) {
				c[this.defaultEventAction]()
			}
		}
	},
	doRelay : function (c, b, a) {
		return b.call(this.scope || this, c, a)
	},
	enter : false,
	left : false,
	right : false,
	up : false,
	down : false,
	tab : false,
	esc : false,
	pageUp : false,
	pageDown : false,
	del : false,
	home : false,
	end : false,
	space : false,
	keyToHandler : {
		37 : "left",
		39 : "right",
		38 : "up",
		40 : "down",
		33 : "pageUp",
		34 : "pageDown",
		46 : "del",
		36 : "home",
		35 : "end",
		13 : "enter",
		27 : "esc",
		9 : "tab",
		32 : "space"
	},
	stopKeyUp : function (b) {
		var a = b.getKey();
		if (a >= 37 && a <= 40) {
			b.stopEvent()
		}
	},
	destroy : function () {
		this.disable()
	},
	enable : function () {
		if (this.disabled) {
			if (Ext.isSafari2) {
				this.el.on("keyup", this.stopKeyUp, this)
			}
			this.el.on(this.isKeydown() ? "keydown" : "keypress", this.relay, this);
			this.disabled = false
		}
	},
	disable : function () {
		if (!this.disabled) {
			if (Ext.isSafari2) {
				this.el.un("keyup", this.stopKeyUp, this)
			}
			this.el.un(this.isKeydown() ? "keydown" : "keypress", this.relay, this);
			this.disabled = true
		}
	},
	setDisabled : function (a) {
		this[a ? "disable" : "enable"]()
	},
	isKeydown : function () {
		return this.forceKeyDown || Ext.EventManager.useKeydown
	}
};
Ext.KeyMap = function (c, b, a) {
	this.el = Ext.get(c);
	this.eventName = a || "keydown";
	this.bindings = [];
	if (b) {
		this.addBinding(b)
	}
	this.enable()
};
Ext.KeyMap.prototype = {
	stopEvent : false,
	addBinding : function (b) {
		if (Ext.isArray(b)) {
			Ext.each(b, function (j) {
					this.addBinding(j)
				}, this);
			return
		}
		var k = b.key,
		g = b.fn || b.handler,
		l = b.scope;
		if (b.stopEvent) {
			this.stopEvent = b.stopEvent
		}
		if (typeof k == "string") {
			var h = [];
			var e = k.toUpperCase();
			for (var c = 0, d = e.length; c < d; c++) {
				h.push(e.charCodeAt(c))
			}
			k = h
		}
		var a = Ext.isArray(k);
		var i = function (o) {
			if (this.checkModifiers(b, o)) {
				var m = o.getKey();
				if (a) {
					for (var n = 0, j = k.length; n < j; n++) {
						if (k[n] == m) {
							if (this.stopEvent) {
								o.stopEvent()
							}
							g.call(l || window, m, o);
							return
						}
					}
				} else {
					if (m == k) {
						if (this.stopEvent) {
							o.stopEvent()
						}
						g.call(l || window, m, o)
					}
				}
			}
		};
		this.bindings.push(i)
	},
	checkModifiers : function (b, h) {
		var j,
		d,
		g = ["shift", "ctrl", "alt"];
		for (var c = 0, a = g.length; c < a; ++c) {
			d = g[c];
			j = b[d];
			if (!(j === undefined || (j === h[d + "Key"]))) {
				return false
			}
		}
		return true
	},
	on : function (b, d, c) {
		var h,
		a,
		e,
		g;
		if (typeof b == "object" && !Ext.isArray(b)) {
			h = b.key;
			a = b.shift;
			e = b.ctrl;
			g = b.alt
		} else {
			h = b
		}
		this.addBinding({
				key : h,
				shift : a,
				ctrl : e,
				alt : g,
				fn : d,
				scope : c
			})
	},
	handleKeyDown : function (g) {
		if (this.enabled) {
			var c = this.bindings;
			for (var d = 0, a = c.length; d < a; d++) {
				c[d].call(this, g)
			}
		}
	},
	isEnabled : function () {
		return this.enabled
	},
	enable : function () {
		if (!this.enabled) {
			this.el.on(this.eventName, this.handleKeyDown, this);
			this.enabled = true
		}
	},
	disable : function () {
		if (this.enabled) {
			this.el.removeListener(this.eventName, this.handleKeyDown, this);
			this.enabled = false
		}
	},
	setDisabled : function (a) {
		this[a ? "disable" : "enable"]()
	}
};
Ext.util.TextMetrics = function () {
	var a;
	return {
		measure : function (b, c, d) {
			if (!a) {
				a = Ext.util.TextMetrics.Instance(b, d)
			}
			a.bind(b);
			a.setFixedWidth(d || "auto");
			return a.getSize(c)
		},
		createInstance : function (b, c) {
			return Ext.util.TextMetrics.Instance(b, c)
		}
	}
}
();
Ext.util.TextMetrics.Instance = function (b, d) {
	var c = new Ext.Element(document.createElement("div"));
	document.body.appendChild(c.dom);
	c.position("absolute");
	c.setLeftTop(-1000, -1000);
	c.hide();
	if (d) {
		c.setWidth(d)
	}
	var a = {
		getSize : function (g) {
			c.update(g);
			var e = c.getSize();
			c.update("");
			return e
		},
		bind : function (e) {
			c.setStyle(Ext.fly(e).getStyles("font-size", "font-style", "font-weight", "font-family", "line-height", "text-transform", "letter-spacing"))
		},
		setFixedWidth : function (e) {
			c.setWidth(e)
		},
		getWidth : function (e) {
			c.dom.style.width = "auto";
			return this.getSize(e).width
		},
		getHeight : function (e) {
			return this.getSize(e).height
		}
	};
	a.bind(b);
	return a
};
Ext.Element.addMethods({
		getTextWidth : function (c, b, a) {
			return (Ext.util.TextMetrics.measure(this.dom, Ext.value(c, this.dom.innerHTML, true)).width).constrain(b || 0, a || 1000000)
		}
	});
Ext.util.Cookies = {
	set : function (c, e) {
		var a = arguments;
		var i = arguments.length;
		var b = (i > 2) ? a[2] : null;
		var h = (i > 3) ? a[3] : "/";
		var d = (i > 4) ? a[4] : null;
		var g = (i > 5) ? a[5] : false;
		document.cookie = c + "=" + escape(e) + ((b === null) ? "" : ("; expires=" + b.toGMTString())) + ((h === null) ? "" : ("; path=" + h)) + ((d === null) ? "" : ("; domain=" + d)) + ((g === true) ? "; secure" : "")
	},
	get : function (d) {
		var b = d + "=";
		var g = b.length;
		var a = document.cookie.length;
		var e = 0;
		var c = 0;
		while (e < a) {
			c = e + g;
			if (document.cookie.substring(e, c) == b) {
				return Ext.util.Cookies.getCookieVal(c)
			}
			e = document.cookie.indexOf(" ", e) + 1;
			if (e === 0) {
				break
			}
		}
		return null
	},
	clear : function (a) {
		if (Ext.util.Cookies.get(a)) {
			document.cookie = a + "=; expires=Thu, 01-Jan-70 00:00:01 GMT"
		}
	},
	getCookieVal : function (b) {
		var a = document.cookie.indexOf(";", b);
		if (a == -1) {
			a = document.cookie.length
		}
		return unescape(document.cookie.substring(b, a))
	}
};
Ext.handleError = function (a) {
	throw a
};
Ext.Error = function (a) {
	this.message = (this.lang[a]) ? this.lang[a] : a
};
Ext.Error.prototype = new Error();
Ext.apply(Ext.Error.prototype, {
		lang : {},
		name : "Ext.Error",
		getName : function () {
			return this.name
		},
		getMessage : function () {
			return this.message
		},
		toJson : function () {
			return Ext.encode(this)
		}
	});
Ext.ComponentMgr = function () {
	var c = new Ext.util.MixedCollection();
	var b = {};
	var a = {};
	return {
		register : function (d) {
			c.add(d)
		},
		unregister : function (d) {
			c.remove(d)
		},
		get : function (d) {
			return c.get(d)
		},
		onAvailable : function (g, e, d) {
			c.on("add", function (h, i) {
					if (i.id == g) {
						e.call(d || i, i);
						c.un("add", e, d)
					}
				})
		},
		all : c,
		types : b,
		ptypes : a,
		isRegistered : function (d) {
			return b[d] !== undefined
		},
		isPluginRegistered : function (d) {
			return a[d] !== undefined
		},
		registerType : function (e, d) {
			b[e] = d;
			d.xtype = e
		},
		create : function (d, e) {
			return d.render ? d : new b[d.xtype || e](d)
		},
		registerPlugin : function (e, d) {
			a[e] = d;
			d.ptype = e
		},
		createPlugin : function (e, g) {
			var d = a[e.ptype || g];
			if (d.init) {
				return d
			} else {
				return new d(e)
			}
		}
	}
}
();
Ext.reg = Ext.ComponentMgr.registerType;
Ext.preg = Ext.ComponentMgr.registerPlugin;
Ext.create = Ext.ComponentMgr.create;
Ext.Component = function (b) {
	b = b || {};
	if (b.initialConfig) {
		if (b.isAction) {
			this.baseAction = b
		}
		b = b.initialConfig
	} else {
		if (b.tagName || b.dom || Ext.isString(b)) {
			b = {
				applyTo : b,
				id : b.id || b
			}
		}
	}
	this.initialConfig = b;
	Ext.apply(this, b);
	this.addEvents("added", "disable", "enable", "beforeshow", "show", "beforehide", "hide", "removed", "beforerender", "render", "afterrender", "beforedestroy", "destroy", "beforestaterestore", "staterestore", "beforestatesave", "statesave");
	this.getId();
	Ext.ComponentMgr.register(this);
	Ext.Component.superclass.constructor.call(this);
	if (this.baseAction) {
		this.baseAction.addComponent(this)
	}
	this.initComponent();
	if (this.plugins) {
		if (Ext.isArray(this.plugins)) {
			for (var c = 0, a = this.plugins.length; c < a; c++) {
				this.plugins[c] = this.initPlugin(this.plugins[c])
			}
		} else {
			this.plugins = this.initPlugin(this.plugins)
		}
	}
	if (this.stateful !== false) {
		this.initState()
	}
	if (this.applyTo) {
		this.applyToMarkup(this.applyTo);
		delete this.applyTo
	} else {
		if (this.renderTo) {
			this.render(this.renderTo);
			delete this.renderTo
		}
	}
};
Ext.Component.AUTO_ID = 1000;
Ext.extend(Ext.Component, Ext.util.Observable, {
		disabled : false,
		hidden : false,
		autoEl : "div",
		disabledClass : "x-item-disabled",
		allowDomMove : true,
		autoShow : false,
		hideMode : "display",
		hideParent : false,
		rendered : false,
		tplWriteMode : "overwrite",
		bubbleEvents : [],
		ctype : "Ext.Component",
		actionMode : "el",
		getActionEl : function () {
			return this[this.actionMode]
		},
		initPlugin : function (a) {
			if (a.ptype && !Ext.isFunction(a.init)) {
				a = Ext.ComponentMgr.createPlugin(a)
			} else {
				if (Ext.isString(a)) {
					a = Ext.ComponentMgr.createPlugin({
								ptype : a
							})
				}
			}
			a.init(this);
			return a
		},
		initComponent : function () {
			if (this.listeners) {
				this.on(this.listeners);
				delete this.listeners
			}
			this.enableBubble(this.bubbleEvents)
		},
		render : function (b, a) {
			if (!this.rendered && this.fireEvent("beforerender", this) !== false) {
				if (!b && this.el) {
					this.el = Ext.get(this.el);
					b = this.el.dom.parentNode;
					this.allowDomMove = false
				}
				this.container = Ext.get(b);
				if (this.ctCls) {
					this.container.addClass(this.ctCls)
				}
				this.rendered = true;
				if (a !== undefined) {
					if (Ext.isNumber(a)) {
						a = this.container.dom.childNodes[a]
					} else {
						a = Ext.getDom(a)
					}
				}
				this.onRender(this.container, a || null);
				if (this.autoShow) {
					this.el.removeClass(["x-hidden", "x-hide-" + this.hideMode])
				}
				if (this.cls) {
					this.el.addClass(this.cls);
					delete this.cls
				}
				if (this.style) {
					this.el.applyStyles(this.style);
					delete this.style
				}
				if (this.overCls) {
					this.el.addClassOnOver(this.overCls)
				}
				this.fireEvent("render", this);
				var c = this.getContentTarget();
				if (this.html) {
					c.update(Ext.DomHelper.markup(this.html));
					delete this.html
				}
				if (this.contentEl) {
					var d = Ext.getDom(this.contentEl);
					Ext.fly(d).removeClass(["x-hidden", "x-hide-display"]);
					c.appendChild(d)
				}
				if (this.tpl) {
					if (!this.tpl.compile) {
						this.tpl = new Ext.XTemplate(this.tpl)
					}
					if (this.data) {
						this.tpl[this.tplWriteMode](c, this.data);
						delete this.data
					}
				}
				this.afterRender(this.container);
				if (this.hidden) {
					this.doHide()
				}
				if (this.disabled) {
					this.disable(true)
				}
				if (this.stateful !== false) {
					this.initStateEvents()
				}
				this.fireEvent("afterrender", this)
			}
			return this
		},
		update : function (b, d, a) {
			var c = this.getContentTarget();
			if (this.tpl && typeof b !== "string") {
				this.tpl[this.tplWriteMode](c, b || {})
			} else {
				var e = Ext.isObject(b) ? Ext.DomHelper.markup(b) : b;
				c.update(e, d, a)
			}
		},
		onAdded : function (a, b) {
			this.ownerCt = a;
			this.initRef();
			this.fireEvent("added", this, a, b)
		},
		onRemoved : function () {
			this.removeRef();
			this.fireEvent("removed", this, this.ownerCt);
			delete this.ownerCt
		},
		initRef : function () {
			if (this.ref && !this.refOwner) {
				var d = this.ref.split("/"),
				c = d.length,
				b = 0,
				a = this;
				while (a && b < c) {
					a = a.ownerCt;
					++b
				}
				if (a) {
					a[this.refName = d[--b]] = this;
					this.refOwner = a
				}
			}
		},
		removeRef : function () {
			if (this.refOwner && this.refName) {
				delete this.refOwner[this.refName];
				delete this.refOwner
			}
		},
		initState : function () {
			if (Ext.state.Manager) {
				var b = this.getStateId();
				if (b) {
					var a = Ext.state.Manager.get(b);
					if (a) {
						if (this.fireEvent("beforestaterestore", this, a) !== false) {
							this.applyState(Ext.apply({}, a));
							this.fireEvent("staterestore", this, a)
						}
					}
				}
			}
		},
		getStateId : function () {
			return this.stateId || ((/^(ext-comp-|ext-gen)/).test(String(this.id)) ? null : this.id)
		},
		initStateEvents : function () {
			if (this.stateEvents) {
				for (var a = 0, b; b = this.stateEvents[a]; a++) {
					this.on(b, this.saveState, this, {
							delay : 100
						})
				}
			}
		},
		applyState : function (a) {
			if (a) {
				Ext.apply(this, a)
			}
		},
		getState : function () {
			return null
		},
		saveState : function () {
			if (Ext.state.Manager && this.stateful !== false) {
				var b = this.getStateId();
				if (b) {
					var a = this.getState();
					if (this.fireEvent("beforestatesave", this, a) !== false) {
						Ext.state.Manager.set(b, a);
						this.fireEvent("statesave", this, a)
					}
				}
			}
		},
		applyToMarkup : function (a) {
			this.allowDomMove = false;
			this.el = Ext.get(a);
			this.render(this.el.dom.parentNode)
		},
		addClass : function (a) {
			if (this.el) {
				this.el.addClass(a)
			} else {
				this.cls = this.cls ? this.cls + " " + a : a
			}
			return this
		},
		removeClass : function (a) {
			if (this.el) {
				this.el.removeClass(a)
			} else {
				if (this.cls) {
					this.cls = this.cls.split(" ").remove(a).join(" ")
				}
			}
			return this
		},
		onRender : function (b, a) {
			if (!this.el && this.autoEl) {
				if (Ext.isString(this.autoEl)) {
					this.el = document.createElement(this.autoEl)
				} else {
					var c = document.createElement("div");
					Ext.DomHelper.overwrite(c, this.autoEl);
					this.el = c.firstChild
				}
				if (!this.el.id) {
					this.el.id = this.getId()
				}
			}
			if (this.el) {
				this.el = Ext.get(this.el);
				if (this.allowDomMove !== false) {
					b.dom.insertBefore(this.el.dom, a);
					if (c) {
						Ext.removeNode(c);
						c = null
					}
				}
			}
		},
		getAutoCreate : function () {
			var a = Ext.isObject(this.autoCreate) ? this.autoCreate : Ext.apply({}, this.defaultAutoCreate);
			if (this.id && !a.id) {
				a.id = this.id
			}
			return a
		},
		afterRender : Ext.emptyFn,
		destroy : function () {
			if (!this.isDestroyed) {
				if (this.fireEvent("beforedestroy", this) !== false) {
					this.destroying = true;
					this.beforeDestroy();
					if (this.ownerCt && this.ownerCt.remove) {
						this.ownerCt.remove(this, false)
					}
					if (this.rendered) {
						this.el.remove();
						if (this.actionMode == "container" || this.removeMode == "container") {
							this.container.remove()
						}
					}
					if (this.focusTask && this.focusTask.cancel) {
						this.focusTask.cancel()
					}
					this.onDestroy();
					Ext.ComponentMgr.unregister(this);
					this.fireEvent("destroy", this);
					this.purgeListeners();
					this.destroying = false;
					this.isDestroyed = true
				}
			}
		},
		deleteMembers : function () {
			var b = arguments;
			for (var c = 0, a = b.length; c < a; ++c) {
				delete this[b[c]]
			}
		},
		beforeDestroy : Ext.emptyFn,
		onDestroy : Ext.emptyFn,
		getEl : function () {
			return this.el
		},
		getContentTarget : function () {
			return this.el
		},
		getId : function () {
			return this.id || (this.id = "ext-comp-" + (++Ext.Component.AUTO_ID))
		},
		getItemId : function () {
			return this.itemId || this.getId()
		},
		focus : function (b, a) {
			if (a) {
				this.focusTask = new Ext.util.DelayedTask(this.focus, this, [b, false]);
				this.focusTask.delay(Ext.isNumber(a) ? a : 10);
				return this
			}
			if (this.rendered && !this.isDestroyed) {
				this.el.focus();
				if (b === true) {
					this.el.dom.select()
				}
			}
			return this
		},
		blur : function () {
			if (this.rendered) {
				this.el.blur()
			}
			return this
		},
		disable : function (a) {
			if (this.rendered) {
				this.onDisable()
			}
			this.disabled = true;
			if (a !== true) {
				this.fireEvent("disable", this)
			}
			return this
		},
		onDisable : function () {
			this.getActionEl().addClass(this.disabledClass);
			this.el.dom.disabled = true
		},
		enable : function () {
			if (this.rendered) {
				this.onEnable()
			}
			this.disabled = false;
			this.fireEvent("enable", this);
			return this
		},
		onEnable : function () {
			this.getActionEl().removeClass(this.disabledClass);
			this.el.dom.disabled = false
		},
		setDisabled : function (a) {
			return this[a ? "disable" : "enable"]()
		},
		show : function () {
			if (this.fireEvent("beforeshow", this) !== false) {
				this.hidden = false;
				if (this.autoRender) {
					this.render(Ext.isBoolean(this.autoRender) ? Ext.getBody() : this.autoRender)
				}
				if (this.rendered) {
					this.onShow()
				}
				this.fireEvent("show", this)
			}
			return this
		},
		onShow : function () {
			this.getVisibilityEl().removeClass("x-hide-" + this.hideMode)
		},
		hide : function () {
			if (this.fireEvent("beforehide", this) !== false) {
				this.doHide();
				this.fireEvent("hide", this)
			}
			return this
		},
		doHide : function () {
			this.hidden = true;
			if (this.rendered) {
				this.onHide()
			}
		},
		onHide : function () {
			this.getVisibilityEl().addClass("x-hide-" + this.hideMode)
		},
		getVisibilityEl : function () {
			return this.hideParent ? this.container : this.getActionEl()
		},
		setVisible : function (a) {
			return this[a ? "show" : "hide"]()
		},
		isVisible : function () {
			return this.rendered && this.getVisibilityEl().isVisible()
		},
		cloneConfig : function (b) {
			b = b || {};
			var c = b.id || Ext.id();
			var a = Ext.applyIf(b, this.initialConfig);
			a.id = c;
			return new this.constructor(a)
		},
		getXType : function () {
			return this.constructor.xtype
		},
		isXType : function (b, a) {
			if (Ext.isFunction(b)) {
				b = b.xtype
			} else {
				if (Ext.isObject(b)) {
					b = b.constructor.xtype
				}
			}
			return !a ? ("/" + this.getXTypes() + "/").indexOf("/" + b + "/") != -1 : this.constructor.xtype == b
		},
		getXTypes : function () {
			var a = this.constructor;
			if (!a.xtypes) {
				var d = [],
				b = this;
				while (b && b.constructor.xtype) {
					d.unshift(b.constructor.xtype);
					b = b.constructor.superclass
				}
				a.xtypeChain = d;
				a.xtypes = d.join("/")
			}
			return a.xtypes
		},
		findParentBy : function (a) {
			for (var b = this.ownerCt; (b != null) && !a(b, this); b = b.ownerCt) {}
			
			return b || null
		},
		findParentByType : function (b, a) {
			return this.findParentBy(function (d) {
					return d.isXType(b, a)
				})
		},
		bubble : function (c, b, a) {
			var d = this;
			while (d) {
				if (c.apply(b || d, a || [d]) === false) {
					break
				}
				d = d.ownerCt
			}
			return this
		},
		getPositionEl : function () {
			return this.positionEl || this.el
		},
		purgeListeners : function () {
			Ext.Component.superclass.purgeListeners.call(this);
			if (this.mons) {
				this.on("beforedestroy", this.clearMons, this, {
						single : true
					})
			}
		},
		clearMons : function () {
			Ext.each(this.mons, function (a) {
					a.item.un(a.ename, a.fn, a.scope)
				}, this);
			this.mons = []
		},
		createMons : function () {
			if (!this.mons) {
				this.mons = [];
				this.on("beforedestroy", this.clearMons, this, {
						single : true
					})
			}
		},
		mon : function (g, b, d, c, a) {
			this.createMons();
			if (Ext.isObject(b)) {
				var j = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/;
				var i = b;
				for (var h in i) {
					if (j.test(h)) {
						continue
					}
					if (Ext.isFunction(i[h])) {
						this.mons.push({
								item : g,
								ename : h,
								fn : i[h],
								scope : i.scope
							});
						g.on(h, i[h], i.scope, i)
					} else {
						this.mons.push({
								item : g,
								ename : h,
								fn : i[h],
								scope : i.scope
							});
						g.on(h, i[h])
					}
				}
				return
			}
			this.mons.push({
					item : g,
					ename : b,
					fn : d,
					scope : c
				});
			g.on(b, d, c, a)
		},
		mun : function (h, c, g, e) {
			var j,
			d;
			this.createMons();
			for (var b = 0, a = this.mons.length; b < a; ++b) {
				d = this.mons[b];
				if (h === d.item && c == d.ename && g === d.fn && e === d.scope) {
					this.mons.splice(b, 1);
					h.un(c, g, e);
					j = true;
					break
				}
			}
			return j
		},
		nextSibling : function () {
			if (this.ownerCt) {
				var a = this.ownerCt.items.indexOf(this);
				if (a != -1 && a + 1 < this.ownerCt.items.getCount()) {
					return this.ownerCt.items.itemAt(a + 1)
				}
			}
			return null
		},
		previousSibling : function () {
			if (this.ownerCt) {
				var a = this.ownerCt.items.indexOf(this);
				if (a > 0) {
					return this.ownerCt.items.itemAt(a - 1)
				}
			}
			return null
		},
		getBubbleTarget : function () {
			return this.ownerCt
		}
	});
Ext.reg("component", Ext.Component);
Ext.Action = Ext.extend(Object, {
			constructor : function (a) {
				this.initialConfig = a;
				this.itemId = a.itemId = (a.itemId || a.id || Ext.id());
				this.items = []
			},
			isAction : true,
			setText : function (a) {
				this.initialConfig.text = a;
				this.callEach("setText", [a])
			},
			getText : function () {
				return this.initialConfig.text
			},
			setIconClass : function (a) {
				this.initialConfig.iconCls = a;
				this.callEach("setIconClass", [a])
			},
			getIconClass : function () {
				return this.initialConfig.iconCls
			},
			setDisabled : function (a) {
				this.initialConfig.disabled = a;
				this.callEach("setDisabled", [a])
			},
			enable : function () {
				this.setDisabled(false)
			},
			disable : function () {
				this.setDisabled(true)
			},
			isDisabled : function () {
				return this.initialConfig.disabled
			},
			setHidden : function (a) {
				this.initialConfig.hidden = a;
				this.callEach("setVisible", [!a])
			},
			show : function () {
				this.setHidden(false)
			},
			hide : function () {
				this.setHidden(true)
			},
			isHidden : function () {
				return this.initialConfig.hidden
			},
			setHandler : function (b, a) {
				this.initialConfig.handler = b;
				this.initialConfig.scope = a;
				this.callEach("setHandler", [b, a])
			},
			each : function (b, a) {
				Ext.each(this.items, b, a)
			},
			callEach : function (e, b) {
				var d = this.items;
				for (var c = 0, a = d.length; c < a; c++) {
					d[c][e].apply(d[c], b)
				}
			},
			addComponent : function (a) {
				this.items.push(a);
				a.on("destroy", this.removeComponent, this)
			},
			removeComponent : function (a) {
				this.items.remove(a)
			},
			execute : function () {
				this.initialConfig.handler.apply(this.initialConfig.scope || window, arguments)
			}
		});
(function () {
		Ext.Layer = function (d, c) {
			d = d || {};
			var e = Ext.DomHelper,
			h = d.parentEl,
			g = h ? Ext.getDom(h) : document.body;
			if (c) {
				this.dom = Ext.getDom(c)
			}
			if (!this.dom) {
				var i = d.dh || {
						tag : "div",
						cls : "x-layer"
					};
				this.dom = e.append(g, i)
			}
			if (d.cls) {
				this.addClass(d.cls)
			}
			this.constrain = d.constrain !== false;
			this.setVisibilityMode(Ext.Element.VISIBILITY);
			if (d.id) {
				this.id = this.dom.id = d.id
			} else {
				this.id = Ext.id(this.dom)
			}
			this.zindex = d.zindex || this.getZIndex();
			this.position("absolute", this.zindex);
			if (d.shadow) {
				this.shadowOffset = d.shadowOffset || 4;
				this.shadow = new Ext.Shadow({
							offset : this.shadowOffset,
							mode : d.shadow
						})
			} else {
				this.shadowOffset = 0
			}
			this.useShim = d.shim !== false && Ext.useShims;
			this.useDisplay = d.useDisplay;
			this.hide()
		};
		var a = Ext.Element.prototype;
		var b = [];
		Ext.extend(Ext.Layer, Ext.Element, {
				getZIndex : function () {
					return this.zindex || parseInt((this.getShim() || this).getStyle("z-index"), 10) || 11000
				},
				getShim : function () {
					if (!this.useShim) {
						return null
					}
					if (this.shim) {
						return this.shim
					}
					var d = b.shift();
					if (!d) {
						d = this.createShim();
						d.enableDisplayMode("block");
						d.dom.style.display = "none";
						d.dom.style.visibility = "visible"
					}
					var c = this.dom.parentNode;
					if (d.dom.parentNode != c) {
						c.insertBefore(d.dom, this.dom)
					}
					d.setStyle("z-index", this.getZIndex() - 2);
					this.shim = d;
					return d
				},
				hideShim : function () {
					if (this.shim) {
						this.shim.setDisplayed(false);
						b.push(this.shim);
						delete this.shim
					}
				},
				disableShadow : function () {
					if (this.shadow) {
						this.shadowDisabled = true;
						this.shadow.hide();
						this.lastShadowOffset = this.shadowOffset;
						this.shadowOffset = 0
					}
				},
				enableShadow : function (c) {
					if (this.shadow) {
						this.shadowDisabled = false;
						if (Ext.isDefined(this.lastShadowOffset)) {
							this.shadowOffset = this.lastShadowOffset;
							delete this.lastShadowOffset
						}
						if (c) {
							this.sync(true)
						}
					}
				},
				sync : function (d) {
					var n = this.shadow;
					if (!this.updating && this.isVisible() && (n || this.useShim)) {
						var i = this.getShim(),
						m = this.getWidth(),
						j = this.getHeight(),
						e = this.getLeft(true),
						o = this.getTop(true);
						if (n && !this.shadowDisabled) {
							if (d && !n.isVisible()) {
								n.show(this)
							} else {
								n.realign(e, o, m, j)
							}
							if (i) {
								if (d) {
									i.show()
								}
								var k = n.el.getXY(),
								g = i.dom.style,
								c = n.el.getSize();
								g.left = (k[0]) + "px";
								g.top = (k[1]) + "px";
								g.width = (c.width) + "px";
								g.height = (c.height) + "px"
							}
						} else {
							if (i) {
								if (d) {
									i.show()
								}
								i.setSize(m, j);
								i.setLeftTop(e, o)
							}
						}
					}
				},
				destroy : function () {
					this.hideShim();
					if (this.shadow) {
						this.shadow.hide()
					}
					this.removeAllListeners();
					Ext.removeNode(this.dom);
					delete this.dom
				},
				remove : function () {
					this.destroy()
				},
				beginUpdate : function () {
					this.updating = true
				},
				endUpdate : function () {
					this.updating = false;
					this.sync(true)
				},
				hideUnders : function (c) {
					if (this.shadow) {
						this.shadow.hide()
					}
					this.hideShim()
				},
				constrainXY : function () {
					if (this.constrain) {
						var j = Ext.lib.Dom.getViewWidth(),
						d = Ext.lib.Dom.getViewHeight();
						var o = Ext.getDoc().getScroll();
						var n = this.getXY();
						var k = n[0],
						i = n[1];
						var c = this.shadowOffset;
						var l = this.dom.offsetWidth + c,
						e = this.dom.offsetHeight + c;
						var g = false;
						if ((k + l) > j + o.left) {
							k = j - l - c;
							g = true
						}
						if ((i + e) > d + o.top) {
							i = d - e - c;
							g = true
						}
						if (k < o.left) {
							k = o.left;
							g = true
						}
						if (i < o.top) {
							i = o.top;
							g = true
						}
						if (g) {
							if (this.avoidY) {
								var m = this.avoidY;
								if (i <= m && (i + e) >= m) {
									i = m - e - 5
								}
							}
							n = [k, i];
							this.storeXY(n);
							a.setXY.call(this, n);
							this.sync()
						}
					}
					return this
				},
				getConstrainOffset : function () {
					return this.shadowOffset
				},
				isVisible : function () {
					return this.visible
				},
				showAction : function () {
					this.visible = true;
					if (this.useDisplay === true) {
						this.setDisplayed("")
					} else {
						if (this.lastXY) {
							a.setXY.call(this, this.lastXY)
						} else {
							if (this.lastLT) {
								a.setLeftTop.call(this, this.lastLT[0], this.lastLT[1])
							}
						}
					}
				},
				hideAction : function () {
					this.visible = false;
					if (this.useDisplay === true) {
						this.setDisplayed(false)
					} else {
						this.setLeftTop(-10000, -10000)
					}
				},
				setVisible : function (i, h, k, l, j) {
					if (i) {
						this.showAction()
					}
					if (h && i) {
						var g = function () {
							this.sync(true);
							if (l) {
								l()
							}
						}
						.createDelegate(this);
						a.setVisible.call(this, true, true, k, g, j)
					} else {
						if (!i) {
							this.hideUnders(true)
						}
						var g = l;
						if (h) {
							g = function () {
								this.hideAction();
								if (l) {
									l()
								}
							}
							.createDelegate(this)
						}
						a.setVisible.call(this, i, h, k, g, j);
						if (i) {
							this.sync(true)
						} else {
							if (!h) {
								this.hideAction()
							}
						}
					}
					return this
				},
				storeXY : function (c) {
					delete this.lastLT;
					this.lastXY = c
				},
				storeLeftTop : function (d, c) {
					delete this.lastXY;
					this.lastLT = [d, c]
				},
				beforeFx : function () {
					this.beforeAction();
					return Ext.Layer.superclass.beforeFx.apply(this, arguments)
				},
				afterFx : function () {
					Ext.Layer.superclass.afterFx.apply(this, arguments);
					this.sync(this.isVisible())
				},
				beforeAction : function () {
					if (!this.updating && this.shadow) {
						this.shadow.hide()
					}
				},
				setLeft : function (c) {
					this.storeLeftTop(c, this.getTop(true));
					a.setLeft.apply(this, arguments);
					this.sync();
					return this
				},
				setTop : function (c) {
					this.storeLeftTop(this.getLeft(true), c);
					a.setTop.apply(this, arguments);
					this.sync();
					return this
				},
				setLeftTop : function (d, c) {
					this.storeLeftTop(d, c);
					a.setLeftTop.apply(this, arguments);
					this.sync();
					return this
				},
				setXY : function (j, h, k, l, i) {
					this.fixDisplay();
					this.beforeAction();
					this.storeXY(j);
					var g = this.createCB(l);
					a.setXY.call(this, j, h, k, g, i);
					if (!h) {
						g()
					}
					return this
				},
				createCB : function (e) {
					var d = this;
					return function () {
						d.constrainXY();
						d.sync(true);
						if (e) {
							e()
						}
					}
				},
				setX : function (g, h, j, k, i) {
					this.setXY([g, this.getY()], h, j, k, i);
					return this
				},
				setY : function (k, g, i, j, h) {
					this.setXY([this.getX(), k], g, i, j, h);
					return this
				},
				setSize : function (j, k, i, m, n, l) {
					this.beforeAction();
					var g = this.createCB(n);
					a.setSize.call(this, j, k, i, m, g, l);
					if (!i) {
						g()
					}
					return this
				},
				setWidth : function (i, h, k, l, j) {
					this.beforeAction();
					var g = this.createCB(l);
					a.setWidth.call(this, i, h, k, g, j);
					if (!h) {
						g()
					}
					return this
				},
				setHeight : function (j, i, l, m, k) {
					this.beforeAction();
					var g = this.createCB(m);
					a.setHeight.call(this, j, i, l, g, k);
					if (!i) {
						g()
					}
					return this
				},
				setBounds : function (o, m, p, i, n, k, l, j) {
					this.beforeAction();
					var g = this.createCB(l);
					if (!n) {
						this.storeXY([o, m]);
						a.setXY.call(this, [o, m]);
						a.setSize.call(this, p, i, n, k, g, j);
						g()
					} else {
						a.setBounds.call(this, o, m, p, i, n, k, g, j)
					}
					return this
				},
				setZIndex : function (c) {
					this.zindex = c;
					this.setStyle("z-index", c + 2);
					if (this.shadow) {
						this.shadow.setZIndex(c + 1)
					}
					if (this.shim) {
						this.shim.setStyle("z-index", c)
					}
					return this
				}
			})
	})();
Ext.Shadow = function (d) {
	Ext.apply(this, d);
	if (typeof this.mode != "string") {
		this.mode = this.defaultMode
	}
	var e = this.offset,
	c = {
		h : 0
	},
	b = Math.floor(this.offset / 2);
	switch (this.mode.toLowerCase()) {
	case "drop":
		c.w = 0;
		c.l = c.t = e;
		c.t -= 1;
		if (Ext.isIE) {
			c.l -= this.offset + b;
			c.t -= this.offset + b;
			c.w -= b;
			c.h -= b;
			c.t += 1
		}
		break;
	case "sides":
		c.w = (e * 2);
		c.l = -e;
		c.t = e - 1;
		if (Ext.isIE) {
			c.l -= (this.offset - b);
			c.t -= this.offset + b;
			c.l += 1;
			c.w -= (this.offset - b) * 2;
			c.w -= b + 1;
			c.h -= 1
		}
		break;
	case "frame":
		c.w = c.h = (e * 2);
		c.l = c.t = -e;
		c.t += 1;
		c.h -= 2;
		if (Ext.isIE) {
			c.l -= (this.offset - b);
			c.t -= (this.offset - b);
			c.l += 1;
			c.w -= (this.offset + b + 1);
			c.h -= (this.offset + b);
			c.h += 1
		}
		break
	}
	this.adjusts = c
};
Ext.Shadow.prototype = {
	offset : 4,
	defaultMode : "drop",
	show : function (a) {
		a = Ext.get(a);
		if (!this.el) {
			this.el = Ext.Shadow.Pool.pull();
			if (this.el.dom.nextSibling != a.dom) {
				this.el.insertBefore(a)
			}
		}
		this.el.setStyle("z-index", this.zIndex || parseInt(a.getStyle("z-index"), 10) - 1);
		if (Ext.isIE) {
			this.el.dom.style.filter = "progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius=" + (this.offset) + ")"
		}
		this.realign(a.getLeft(true), a.getTop(true), a.getWidth(), a.getHeight());
		this.el.dom.style.display = "block"
	},
	isVisible : function () {
		return this.el ? true : false
	},
	realign : function (b, r, q, g) {
		if (!this.el) {
			return
		}
		var n = this.adjusts,
		k = this.el.dom,
		u = k.style,
		i = 0,
		p = (q + n.w),
		e = (g + n.h),
		j = p + "px",
		o = e + "px",
		m,
		c;
		u.left = (b + n.l) + "px";
		u.top = (r + n.t) + "px";
		if (u.width != j || u.height != o) {
			u.width = j;
			u.height = o;
			if (!Ext.isIE) {
				m = k.childNodes;
				c = Math.max(0, (p - 12)) + "px";
				m[0].childNodes[1].style.width = c;
				m[1].childNodes[1].style.width = c;
				m[2].childNodes[1].style.width = c;
				m[1].style.height = Math.max(0, (e - 12)) + "px"
			}
		}
	},
	hide : function () {
		if (this.el) {
			this.el.dom.style.display = "none";
			Ext.Shadow.Pool.push(this.el);
			delete this.el
		}
	},
	setZIndex : function (a) {
		this.zIndex = a;
		if (this.el) {
			this.el.setStyle("z-index", a)
		}
	}
};
Ext.Shadow.Pool = function () {
	var b = [],
	a = Ext.isIE ? '<div class="x-ie-shadow"></div>' : '<div class="x-shadow"><div class="xst"><div class="xstl"></div><div class="xstc"></div><div class="xstr"></div></div><div class="xsc"><div class="xsml"></div><div class="xsmc"></div><div class="xsmr"></div></div><div class="xsb"><div class="xsbl"></div><div class="xsbc"></div><div class="xsbr"></div></div></div>';
	return {
		pull : function () {
			var c = b.shift();
			if (!c) {
				c = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, a));
				c.autoBoxAdjust = false
			}
			return c
		},
		push : function (c) {
			b.push(c)
		}
	}
}
();
Ext.BoxComponent = Ext.extend(Ext.Component, {
			initComponent : function () {
				Ext.BoxComponent.superclass.initComponent.call(this);
				this.addEvents("resize", "move")
			},
			boxReady : false,
			deferHeight : false,
			setSize : function (b, d) {
				if (typeof b == "object") {
					d = b.height;
					b = b.width
				}
				if (Ext.isDefined(b) && Ext.isDefined(this.boxMinWidth) && (b < this.boxMinWidth)) {
					b = this.boxMinWidth
				}
				if (Ext.isDefined(d) && Ext.isDefined(this.boxMinHeight) && (d < this.boxMinHeight)) {
					d = this.boxMinHeight
				}
				if (Ext.isDefined(b) && Ext.isDefined(this.boxMaxWidth) && (b > this.boxMaxWidth)) {
					b = this.boxMaxWidth
				}
				if (Ext.isDefined(d) && Ext.isDefined(this.boxMaxHeight) && (d > this.boxMaxHeight)) {
					d = this.boxMaxHeight
				}
				if (!this.boxReady) {
					this.width = b;
					this.height = d;
					return this
				}
				if (this.cacheSizes !== false && this.lastSize && this.lastSize.width == b && this.lastSize.height == d) {
					return this
				}
				this.lastSize = {
					width : b,
					height : d
				};
				var c = this.adjustSize(b, d),
				g = c.width,
				a = c.height,
				e;
				if (g !== undefined || a !== undefined) {
					e = this.getResizeEl();
					if (!this.deferHeight && g !== undefined && a !== undefined) {
						e.setSize(g, a)
					} else {
						if (!this.deferHeight && a !== undefined) {
							e.setHeight(a)
						} else {
							if (g !== undefined) {
								e.setWidth(g)
							}
						}
					}
					this.onResize(g, a, b, d);
					this.fireEvent("resize", this, g, a, b, d)
				}
				return this
			},
			setWidth : function (a) {
				return this.setSize(a)
			},
			setHeight : function (a) {
				return this.setSize(undefined, a)
			},
			getSize : function () {
				return this.getResizeEl().getSize()
			},
			getWidth : function () {
				return this.getResizeEl().getWidth()
			},
			getHeight : function () {
				return this.getResizeEl().getHeight()
			},
			getOuterSize : function () {
				var a = this.getResizeEl();
				return {
					width : a.getWidth() + a.getMargins("lr"),
					height : a.getHeight() + a.getMargins("tb")
				}
			},
			getPosition : function (a) {
				var b = this.getPositionEl();
				if (a === true) {
					return [b.getLeft(true), b.getTop(true)]
				}
				return this.xy || b.getXY()
			},
			getBox : function (a) {
				var c = this.getPosition(a);
				var b = this.getSize();
				b.x = c[0];
				b.y = c[1];
				return b
			},
			updateBox : function (a) {
				this.setSize(a.width, a.height);
				this.setPagePosition(a.x, a.y);
				return this
			},
			getResizeEl : function () {
				return this.resizeEl || this.el
			},
			setAutoScroll : function (a) {
				if (this.rendered) {
					this.getContentTarget().setOverflow(a ? "auto" : "")
				}
				this.autoScroll = a;
				return this
			},
			setPosition : function (a, g) {
				if (a && typeof a[1] == "number") {
					g = a[1];
					a = a[0]
				}
				this.x = a;
				this.y = g;
				if (!this.boxReady) {
					return this
				}
				var b = this.adjustPosition(a, g);
				var e = b.x,
				d = b.y;
				var c = this.getPositionEl();
				if (e !== undefined || d !== undefined) {
					if (e !== undefined && d !== undefined) {
						c.setLeftTop(e, d)
					} else {
						if (e !== undefined) {
							c.setLeft(e)
						} else {
							if (d !== undefined) {
								c.setTop(d)
							}
						}
					}
					this.onPosition(e, d);
					this.fireEvent("move", this, e, d)
				}
				return this
			},
			setPagePosition : function (a, c) {
				if (a && typeof a[1] == "number") {
					c = a[1];
					a = a[0]
				}
				this.pageX = a;
				this.pageY = c;
				if (!this.boxReady) {
					return
				}
				if (a === undefined || c === undefined) {
					return
				}
				var b = this.getPositionEl().translatePoints(a, c);
				this.setPosition(b.left, b.top);
				return this
			},
			afterRender : function () {
				Ext.BoxComponent.superclass.afterRender.call(this);
				if (this.resizeEl) {
					this.resizeEl = Ext.get(this.resizeEl)
				}
				if (this.positionEl) {
					this.positionEl = Ext.get(this.positionEl)
				}
				this.boxReady = true;
				Ext.isDefined(this.autoScroll) && this.setAutoScroll(this.autoScroll);
				this.setSize(this.width, this.height);
				if (this.x || this.y) {
					this.setPosition(this.x, this.y)
				} else {
					if (this.pageX || this.pageY) {
						this.setPagePosition(this.pageX, this.pageY)
					}
				}
			},
			syncSize : function () {
				delete this.lastSize;
				this.setSize(this.autoWidth ? undefined : this.getResizeEl().getWidth(), this.autoHeight ? undefined : this.getResizeEl().getHeight());
				return this
			},
			onResize : function (d, b, a, c) {},
			onPosition : function (a, b) {},
			adjustSize : function (a, b) {
				if (this.autoWidth) {
					a = "auto"
				}
				if (this.autoHeight) {
					b = "auto"
				}
				return {
					width : a,
					height : b
				}
			},
			adjustPosition : function (a, b) {
				return {
					x : a,
					y : b
				}
			}
		});
Ext.reg("box", Ext.BoxComponent);
Ext.Spacer = Ext.extend(Ext.BoxComponent, {
			autoEl : "div"
		});
Ext.reg("spacer", Ext.Spacer);
Ext.SplitBar = function (c, e, b, d, a) {
	this.el = Ext.get(c, true);
	this.el.dom.unselectable = "on";
	this.resizingEl = Ext.get(e, true);
	this.orientation = b || Ext.SplitBar.HORIZONTAL;
	this.minSize = 0;
	this.maxSize = 2000;
	this.animate = false;
	this.useShim = false;
	this.shim = null;
	if (!a) {
		this.proxy = Ext.SplitBar.createProxy(this.orientation)
	} else {
		this.proxy = Ext.get(a).dom
	}
	this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {
				dragElId : this.proxy.id
			});
	this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this);
	this.dd.endDrag = this.onEndProxyDrag.createDelegate(this);
	this.dragSpecs = {};
	this.adapter = new Ext.SplitBar.BasicLayoutAdapter();
	this.adapter.init(this);
	if (this.orientation == Ext.SplitBar.HORIZONTAL) {
		this.placement = d || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT : Ext.SplitBar.RIGHT);
		this.el.addClass("x-splitbar-h")
	} else {
		this.placement = d || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP : Ext.SplitBar.BOTTOM);
		this.el.addClass("x-splitbar-v")
	}
	this.addEvents("resize", "moved", "beforeresize", "beforeapply");
	Ext.SplitBar.superclass.constructor.call(this)
};
Ext.extend(Ext.SplitBar, Ext.util.Observable, {
		onStartProxyDrag : function (a, e) {
			this.fireEvent("beforeresize", this);
			this.overlay = Ext.DomHelper.append(document.body, {
						cls : "x-drag-overlay",
						html : "&#160;"
					}, true);
			this.overlay.unselectable();
			this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
			this.overlay.show();
			Ext.get(this.proxy).setDisplayed("block");
			var c = this.adapter.getElementSize(this);
			this.activeMinSize = this.getMinimumSize();
			this.activeMaxSize = this.getMaximumSize();
			var d = c - this.activeMinSize;
			var b = Math.max(this.activeMaxSize - c, 0);
			if (this.orientation == Ext.SplitBar.HORIZONTAL) {
				this.dd.resetConstraints();
				this.dd.setXConstraint(this.placement == Ext.SplitBar.LEFT ? d : b, this.placement == Ext.SplitBar.LEFT ? b : d, this.tickSize);
				this.dd.setYConstraint(0, 0)
			} else {
				this.dd.resetConstraints();
				this.dd.setXConstraint(0, 0);
				this.dd.setYConstraint(this.placement == Ext.SplitBar.TOP ? d : b, this.placement == Ext.SplitBar.TOP ? b : d, this.tickSize)
			}
			this.dragSpecs.startSize = c;
			this.dragSpecs.startPoint = [a, e];
			Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, a, e)
		},
		onEndProxyDrag : function (c) {
			Ext.get(this.proxy).setDisplayed(false);
			var b = Ext.lib.Event.getXY(c);
			if (this.overlay) {
				Ext.destroy(this.overlay);
				delete this.overlay
			}
			var a;
			if (this.orientation == Ext.SplitBar.HORIZONTAL) {
				a = this.dragSpecs.startSize + (this.placement == Ext.SplitBar.LEFT ? b[0] - this.dragSpecs.startPoint[0] : this.dragSpecs.startPoint[0] - b[0])
			} else {
				a = this.dragSpecs.startSize + (this.placement == Ext.SplitBar.TOP ? b[1] - this.dragSpecs.startPoint[1] : this.dragSpecs.startPoint[1] - b[1])
			}
			a = Math.min(Math.max(a, this.activeMinSize), this.activeMaxSize);
			if (a != this.dragSpecs.startSize) {
				if (this.fireEvent("beforeapply", this, a) !== false) {
					this.adapter.setElementSize(this, a);
					this.fireEvent("moved", this, a);
					this.fireEvent("resize", this, a)
				}
			}
		},
		getAdapter : function () {
			return this.adapter
		},
		setAdapter : function (a) {
			this.adapter = a;
			this.adapter.init(this)
		},
		getMinimumSize : function () {
			return this.minSize
		},
		setMinimumSize : function (a) {
			this.minSize = a
		},
		getMaximumSize : function () {
			return this.maxSize
		},
		setMaximumSize : function (a) {
			this.maxSize = a
		},
		setCurrentSize : function (b) {
			var a = this.animate;
			this.animate = false;
			this.adapter.setElementSize(this, b);
			this.animate = a
		},
		destroy : function (a) {
			Ext.destroy(this.shim, Ext.get(this.proxy));
			this.dd.unreg();
			if (a) {
				this.el.remove()
			}
			this.purgeListeners()
		}
	});
Ext.SplitBar.createProxy = function (b) {
	var c = new Ext.Element(document.createElement("div"));
	document.body.appendChild(c.dom);
	c.unselectable();
	var a = "x-splitbar-proxy";
	c.addClass(a + " " + (b == Ext.SplitBar.HORIZONTAL ? a + "-h" : a + "-v"));
	return c.dom
};
Ext.SplitBar.BasicLayoutAdapter = function () {};
Ext.SplitBar.BasicLayoutAdapter.prototype = {
	init : function (a) {},
	getElementSize : function (a) {
		if (a.orientation == Ext.SplitBar.HORIZONTAL) {
			return a.resizingEl.getWidth()
		} else {
			return a.resizingEl.getHeight()
		}
	},
	setElementSize : function (b, a, c) {
		if (b.orientation == Ext.SplitBar.HORIZONTAL) {
			if (!b.animate) {
				b.resizingEl.setWidth(a);
				if (c) {
					c(b, a)
				}
			} else {
				b.resizingEl.setWidth(a, true, 0.1, c, "easeOut")
			}
		} else {
			if (!b.animate) {
				b.resizingEl.setHeight(a);
				if (c) {
					c(b, a)
				}
			} else {
				b.resizingEl.setHeight(a, true, 0.1, c, "easeOut")
			}
		}
	}
};
Ext.SplitBar.AbsoluteLayoutAdapter = function (a) {
	this.basic = new Ext.SplitBar.BasicLayoutAdapter();
	this.container = Ext.get(a)
};
Ext.SplitBar.AbsoluteLayoutAdapter.prototype = {
	init : function (a) {
		this.basic.init(a)
	},
	getElementSize : function (a) {
		return this.basic.getElementSize(a)
	},
	setElementSize : function (b, a, c) {
		this.basic.setElementSize(b, a, this.moveSplitter.createDelegate(this, [b]))
	},
	moveSplitter : function (a) {
		var b = Ext.SplitBar;
		switch (a.placement) {
		case b.LEFT:
			a.el.setX(a.resizingEl.getRight());
			break;
		case b.RIGHT:
			a.el.setStyle("right", (this.container.getWidth() - a.resizingEl.getLeft()) + "px");
			break;
		case b.TOP:
			a.el.setY(a.resizingEl.getBottom());
			break;
		case b.BOTTOM:
			a.el.setY(a.resizingEl.getTop() - a.el.getHeight());
			break
		}
	}
};
Ext.SplitBar.VERTICAL = 1;
Ext.SplitBar.HORIZONTAL = 2;
Ext.SplitBar.LEFT = 1;
Ext.SplitBar.RIGHT = 2;
Ext.SplitBar.TOP = 3;
Ext.SplitBar.BOTTOM = 4;
Ext.Container = Ext.extend(Ext.BoxComponent, {
			bufferResize : 50,
			autoDestroy : true,
			forceLayout : false,
			defaultType : "panel",
			resizeEvent : "resize",
			bubbleEvents : ["add", "remove"],
			initComponent : function () {
				Ext.Container.superclass.initComponent.call(this);
				this.addEvents("afterlayout", "beforeadd", "beforeremove", "add", "remove");
				var a = this.items;
				if (a) {
					delete this.items;
					this.add(a)
				}
			},
			initItems : function () {
				if (!this.items) {
					this.items = new Ext.util.MixedCollection(false, this.getComponentId);
					this.getLayout()
				}
			},
			setLayout : function (a) {
				if (this.layout && this.layout != a) {
					this.layout.setContainer(null)
				}
				this.layout = a;
				this.initItems();
				a.setContainer(this)
			},
			afterRender : function () {
				Ext.Container.superclass.afterRender.call(this);
				if (!this.layout) {
					this.layout = "auto"
				}
				if (Ext.isObject(this.layout) && !this.layout.layout) {
					this.layoutConfig = this.layout;
					this.layout = this.layoutConfig.type
				}
				if (Ext.isString(this.layout)) {
					this.layout = new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig)
				}
				this.setLayout(this.layout);
				if (this.activeItem !== undefined && this.layout.setActiveItem) {
					var a = this.activeItem;
					delete this.activeItem;
					this.layout.setActiveItem(a)
				}
				if (!this.ownerCt) {
					this.doLayout(false, true)
				}
				if (this.monitorResize === true) {
					Ext.EventManager.onWindowResize(this.doLayout, this, [false])
				}
			},
			getLayoutTarget : function () {
				return this.el
			},
			getComponentId : function (a) {
				return a.getItemId()
			},
			add : function (b) {
				this.initItems();
				var e = arguments.length > 1;
				if (e || Ext.isArray(b)) {
					var a = [];
					Ext.each(e ? arguments : b, function (h) {
							a.push(this.add(h))
						}, this);
					return a
				}
				var g = this.lookupComponent(this.applyDefaults(b));
				var d = this.items.length;
				if (this.fireEvent("beforeadd", this, g, d) !== false && this.onBeforeAdd(g) !== false) {
					this.items.add(g);
					g.onAdded(this, d);
					this.onAdd(g);
					this.fireEvent("add", this, g, d)
				}
				return g
			},
			onAdd : function (a) {},
			onAdded : function (a, b) {
				this.ownerCt = a;
				this.initRef();
				this.cascade(function (d) {
						d.initRef()
					});
				this.fireEvent("added", this, a, b)
			},
			insert : function (e, b) {
				var d = arguments,
				h = d.length,
				a = [],
				g,
				j;
				this.initItems();
				if (h > 2) {
					for (g = h - 1; g >= 1; --g) {
						a.push(this.insert(e, d[g]))
					}
					return a
				}
				j = this.lookupComponent(this.applyDefaults(b));
				e = Math.min(e, this.items.length);
				if (this.fireEvent("beforeadd", this, j, e) !== false && this.onBeforeAdd(j) !== false) {
					if (j.ownerCt == this) {
						this.items.remove(j)
					}
					this.items.insert(e, j);
					j.onAdded(this, e);
					this.onAdd(j);
					this.fireEvent("add", this, j, e)
				}
				return j
			},
			applyDefaults : function (b) {
				var a = this.defaults;
				if (a) {
					if (Ext.isFunction(a)) {
						a = a.call(this, b)
					}
					if (Ext.isString(b)) {
						b = Ext.ComponentMgr.get(b);
						Ext.apply(b, a)
					} else {
						if (!b.events) {
							Ext.applyIf(b.isAction ? b.initialConfig : b, a)
						} else {
							Ext.apply(b, a)
						}
					}
				}
				return b
			},
			onBeforeAdd : function (a) {
				if (a.ownerCt) {
					a.ownerCt.remove(a, false)
				}
				if (this.hideBorders === true) {
					a.border = (a.border === true)
				}
			},
			remove : function (a, b) {
				this.initItems();
				var d = this.getComponent(a);
				if (d && this.fireEvent("beforeremove", this, d) !== false) {
					this.doRemove(d, b);
					this.fireEvent("remove", this, d)
				}
				return d
			},
			onRemove : function (a) {},
			doRemove : function (e, d) {
				var b = this.layout,
				a = b && this.rendered;
				if (a) {
					b.onRemove(e)
				}
				this.items.remove(e);
				e.onRemoved();
				this.onRemove(e);
				if (d === true || (d !== false && this.autoDestroy)) {
					e.destroy()
				}
				if (a) {
					b.afterRemove(e)
				}
			},
			removeAll : function (c) {
				this.initItems();
				var e,
				g = [],
				b = [];
				this.items.each(function (h) {
						g.push(h)
					});
				for (var d = 0, a = g.length; d < a; ++d) {
					e = g[d];
					this.remove(e, c);
					if (e.ownerCt !== this) {
						b.push(e)
					}
				}
				return b
			},
			getComponent : function (a) {
				if (Ext.isObject(a)) {
					a = a.getItemId()
				}
				return this.items.get(a)
			},
			lookupComponent : function (a) {
				if (Ext.isString(a)) {
					return Ext.ComponentMgr.get(a)
				} else {
					if (!a.events) {
						return this.createComponent(a)
					}
				}
				return a
			},
			createComponent : function (a, d) {
				if (a.render) {
					return a
				}
				var b = Ext.create(Ext.apply({
								ownerCt : this
							}, a), d || this.defaultType);
				delete b.initialConfig.ownerCt;
				delete b.ownerCt;
				return b
			},
			canLayout : function () {
				var a = this.getVisibilityEl();
				return a && a.dom && !a.isStyle("display", "none")
			},
			doLayout : function (g, e) {
				var k = this.rendered,
				j = e || this.forceLayout;
				if (this.collapsed || !this.canLayout()) {
					this.deferLayout = this.deferLayout || !g;
					if (!j) {
						return
					}
					g = g && !this.deferLayout
				} else {
					delete this.deferLayout
				}
				if (k && this.layout) {
					this.layout.layout()
				}
				if (g !== true && this.items) {
					var d = this.items.items;
					for (var b = 0, a = d.length; b < a; b++) {
						var h = d[b];
						if (h.doLayout) {
							h.doLayout(false, j)
						}
					}
				}
				if (k) {
					this.onLayout(g, j)
				}
				this.hasLayout = true;
				delete this.forceLayout
			},
			onLayout : Ext.emptyFn,
			shouldBufferLayout : function () {
				var a = this.hasLayout;
				if (this.ownerCt) {
					return a ? !this.hasLayoutPending() : false
				}
				return a
			},
			hasLayoutPending : function () {
				var a = false;
				this.ownerCt.bubble(function (b) {
						if (b.layoutPending) {
							a = true;
							return false
						}
					});
				return a
			},
			onShow : function () {
				Ext.Container.superclass.onShow.call(this);
				if (Ext.isDefined(this.deferLayout)) {
					delete this.deferLayout;
					this.doLayout(true)
				}
			},
			getLayout : function () {
				if (!this.layout) {
					var a = new Ext.layout.AutoLayout(this.layoutConfig);
					this.setLayout(a)
				}
				return this.layout
			},
			beforeDestroy : function () {
				var a;
				if (this.items) {
					while (a = this.items.first()) {
						this.doRemove(a, true)
					}
				}
				if (this.monitorResize) {
					Ext.EventManager.removeResizeListener(this.doLayout, this)
				}
				Ext.destroy(this.layout);
				Ext.Container.superclass.beforeDestroy.call(this)
			},
			cascade : function (g, e, b) {
				if (g.apply(e || this, b || [this]) !== false) {
					if (this.items) {
						var d = this.items.items;
						for (var c = 0, a = d.length; c < a; c++) {
							if (d[c].cascade) {
								d[c].cascade(g, e, b)
							} else {
								g.apply(e || d[c], b || [d[c]])
							}
						}
					}
				}
				return this
			},
			findById : function (c) {
				var a = null,
				b = this;
				this.cascade(function (d) {
						if (b != d && d.id === c) {
							a = d;
							return false
						}
					});
				return a
			},
			findByType : function (b, a) {
				return this.findBy(function (d) {
						return d.isXType(b, a)
					})
			},
			find : function (b, a) {
				return this.findBy(function (d) {
						return d[b] === a
					})
			},
			findBy : function (d, c) {
				var a = [],
				b = this;
				this.cascade(function (e) {
						if (b != e && d.call(c || e, e, b) === true) {
							a.push(e)
						}
					});
				return a
			},
			get : function (a) {
				return this.getComponent(a)
			}
		});
Ext.Container.LAYOUTS = {};
Ext.reg("container", Ext.Container);
Ext.layout.ContainerLayout = Ext.extend(Object, {
			monitorResize : false,
			activeItem : null,
			constructor : function (a) {
				this.id = Ext.id(null, "ext-layout-");
				Ext.apply(this, a)
			},
			type : "container",
			IEMeasureHack : function (k, g) {
				var a = k.dom.childNodes,
				b = a.length,
				n,
				m = [],
				l,
				h,
				j;
				for (h = 0; h < b; h++) {
					n = a[h];
					l = Ext.get(n);
					if (l) {
						m[h] = l.getStyle("display");
						l.setStyle({
								display : "none"
							})
					}
				}
				j = k ? k.getViewSize(g) : {};
				for (h = 0; h < b; h++) {
					n = a[h];
					l = Ext.get(n);
					if (l) {
						l.setStyle({
								display : m[h]
							})
					}
				}
				return j
			},
			getLayoutTargetSize : Ext.EmptyFn,
			layout : function () {
				var a = this.container,
				b = a.getLayoutTarget();
				if (!(this.hasLayout || Ext.isEmpty(this.targetCls))) {
					b.addClass(this.targetCls)
				}
				this.onLayout(a, b);
				a.fireEvent("afterlayout", a, this)
			},
			onLayout : function (a, b) {
				this.renderAll(a, b)
			},
			isValidParent : function (b, a) {
				return a && b.getPositionEl().dom.parentNode == (a.dom || a)
			},
			renderAll : function (e, g) {
				var b = e.items.items,
				d,
				h,
				a = b.length;
				for (d = 0; d < a; d++) {
					h = b[d];
					if (h && (!h.rendered || !this.isValidParent(h, g))) {
						this.renderItem(h, d, g)
					}
				}
			},
			renderItem : function (d, a, b) {
				if (d) {
					if (!d.rendered) {
						d.render(b, a);
						this.configureItem(d)
					} else {
						if (!this.isValidParent(d, b)) {
							if (Ext.isNumber(a)) {
								a = b.dom.childNodes[a]
							}
							b.dom.insertBefore(d.getPositionEl().dom, a || null);
							d.container = b;
							this.configureItem(d)
						}
					}
				}
			},
			getRenderedItems : function (g) {
				var e = g.getLayoutTarget(),
				h = g.items.items,
				a = h.length,
				d,
				j,
				b = [];
				for (d = 0; d < a; d++) {
					if ((j = h[d]).rendered && this.isValidParent(j, e) && j.shouldLayout !== false) {
						b.push(j)
					}
				}
				return b
			},
			configureItem : function (b) {
				if (this.extraCls) {
					var a = b.getPositionEl ? b.getPositionEl() : b;
					a.addClass(this.extraCls)
				}
				if (b.doLayout && this.forceLayout) {
					b.doLayout()
				}
				if (this.renderHidden && b != this.activeItem) {
					b.hide()
				}
			},
			onRemove : function (b) {
				if (this.activeItem == b) {
					delete this.activeItem
				}
				if (b.rendered && this.extraCls) {
					var a = b.getPositionEl ? b.getPositionEl() : b;
					a.removeClass(this.extraCls)
				}
			},
			afterRemove : function (a) {
				if (a.removeRestore) {
					a.removeMode = "container";
					delete a.removeRestore
				}
			},
			onResize : function () {
				var c = this.container,
				a;
				if (c.collapsed) {
					return
				}
				if (a = c.bufferResize && c.shouldBufferLayout()) {
					if (!this.resizeTask) {
						this.resizeTask = new Ext.util.DelayedTask(this.runLayout, this);
						this.resizeBuffer = Ext.isNumber(a) ? a : 50
					}
					c.layoutPending = true;
					this.resizeTask.delay(this.resizeBuffer)
				} else {
					this.runLayout()
				}
			},
			runLayout : function () {
				var a = this.container;
				this.layout();
				a.onLayout();
				delete a.layoutPending
			},
			setContainer : function (b) {
				if (this.monitorResize && b != this.container) {
					var a = this.container;
					if (a) {
						a.un(a.resizeEvent, this.onResize, this)
					}
					if (b) {
						b.on(b.resizeEvent, this.onResize, this)
					}
				}
				this.container = b
			},
			parseMargins : function (b) {
				if (Ext.isNumber(b)) {
					b = b.toString()
				}
				var c = b.split(" "),
				a = c.length;
				if (a == 1) {
					c[1] = c[2] = c[3] = c[0]
				} else {
					if (a == 2) {
						c[2] = c[0];
						c[3] = c[1]
					} else {
						if (a == 3) {
							c[3] = c[1]
						}
					}
				}
				return {
					top : parseInt(c[0], 10) || 0,
					right : parseInt(c[1], 10) || 0,
					bottom : parseInt(c[2], 10) || 0,
					left : parseInt(c[3], 10) || 0
				}
			},
			fieldTpl : (function () {
					var a = new Ext.Template('<div class="x-form-item {itemCls}" tabIndex="-1">', '<label for="{id}" style="{labelStyle}" class="x-form-item-label">{label}{labelSeparator}</label>', '<div class="x-form-element" id="x-form-el-{id}" style="{elementStyle}">', '</div><div class="{clearCls}"></div>', "</div>");
					a.disableFormats = true;
					return a.compile()
				})(),
			destroy : function () {
				if (this.resizeTask && this.resizeTask.cancel) {
					this.resizeTask.cancel()
				}
				if (this.container) {
					this.container.un(this.container.resizeEvent, this.onResize, this)
				}
				if (!Ext.isEmpty(this.targetCls)) {
					var a = this.container.getLayoutTarget();
					if (a) {
						a.removeClass(this.targetCls)
					}
				}
			}
		});
Ext.layout.AutoLayout = Ext.extend(Ext.layout.ContainerLayout, {
			type : "auto",
			monitorResize : true,
			onLayout : function (d, g) {
				Ext.layout.AutoLayout.superclass.onLayout.call(this, d, g);
				var e = this.getRenderedItems(d),
				a = e.length,
				b,
				h;
				for (b = 0; b < a; b++) {
					h = e[b];
					if (h.doLayout) {
						h.doLayout(true)
					}
				}
			}
		});
Ext.Container.LAYOUTS.auto = Ext.layout.AutoLayout;
Ext.layout.FitLayout = Ext.extend(Ext.layout.ContainerLayout, {
			monitorResize : true,
			type : "fit",
			getLayoutTargetSize : function () {
				var a = this.container.getLayoutTarget();
				if (!a) {
					return {}
					
				}
				return a.getStyleSize()
			},
			onLayout : function (a, b) {
				Ext.layout.FitLayout.superclass.onLayout.call(this, a, b);
				if (!a.collapsed) {
					this.setItemSize(this.activeItem || a.items.itemAt(0), this.getLayoutTargetSize())
				}
			},
			setItemSize : function (b, a) {
				if (b && a.height > 0) {
					b.setSize(a)
				}
			}
		});
Ext.Container.LAYOUTS.fit = Ext.layout.FitLayout;
Ext.layout.CardLayout = Ext.extend(Ext.layout.FitLayout, {
			deferredRender : false,
			layoutOnCardChange : false,
			renderHidden : true,
			type : "card",
			setActiveItem : function (d) {
				var a = this.activeItem,
				b = this.container;
				d = b.getComponent(d);
				if (d && a != d) {
					if (a) {
						a.hide();
						if (a.hidden !== true) {
							return false
						}
						a.fireEvent("deactivate", a)
					}
					var c = d.doLayout && (this.layoutOnCardChange || !d.rendered);
					this.activeItem = d;
					delete d.deferLayout;
					d.show();
					this.layout();
					if (c) {
						d.doLayout()
					}
					d.fireEvent("activate", d)
				}
			},
			renderAll : function (a, b) {
				if (this.deferredRender) {
					this.renderItem(this.activeItem, undefined, b)
				} else {
					Ext.layout.CardLayout.superclass.renderAll.call(this, a, b)
				}
			}
		});
Ext.Container.LAYOUTS.card = Ext.layout.CardLayout;
Ext.layout.AnchorLayout = Ext.extend(Ext.layout.ContainerLayout, {
			monitorResize : true,
			type : "anchor",
			defaultAnchor : "100%",
			parseAnchorRE : /^(r|right|b|bottom)$/i,
			getLayoutTargetSize : function () {
				var b = this.container.getLayoutTarget(),
				a = {};
				if (b) {
					a = b.getViewSize();
					if (Ext.isIE && Ext.isStrict && a.width == 0) {
						a = b.getStyleSize()
					}
					a.width -= b.getPadding("lr");
					a.height -= b.getPadding("tb")
				}
				return a
			},
			onLayout : function (m, w) {
				Ext.layout.AnchorLayout.superclass.onLayout.call(this, m, w);
				var p = this.getLayoutTargetSize(),
				k = p.width,
				o = p.height,
				q = w.getStyle("overflow"),
				n = this.getRenderedItems(m),
				t = n.length,
				g = [],
				j,
				a,
				v,
				l,
				h,
				c,
				e,
				d,
				u = 0,
				s,
				b;
				if (k < 20 && o < 20) {
					return
				}
				if (m.anchorSize) {
					if (typeof m.anchorSize == "number") {
						a = m.anchorSize
					} else {
						a = m.anchorSize.width;
						v = m.anchorSize.height
					}
				} else {
					a = m.initialConfig.width;
					v = m.initialConfig.height
				}
				for (s = 0; s < t; s++) {
					l = n[s];
					b = l.getPositionEl();
					if (!l.anchor && l.items && !Ext.isNumber(l.width) && !(Ext.isIE6 && Ext.isStrict)) {
						l.anchor = this.defaultAnchor
					}
					if (l.anchor) {
						h = l.anchorSpec;
						if (!h) {
							d = l.anchor.split(" ");
							l.anchorSpec = h = {
									right : this.parseAnchor(d[0], l.initialConfig.width, a),
									bottom : this.parseAnchor(d[1], l.initialConfig.height, v)
								}
						}
						c = h.right ? this.adjustWidthAnchor(h.right(k) - b.getMargins("lr"), l) : undefined;
						e = h.bottom ? this.adjustHeightAnchor(h.bottom(o) - b.getMargins("tb"), l) : undefined;
						if (c || e) {
							g.push({
									component : l,
									width : c || undefined,
									height : e || undefined
								})
						}
					}
				}
				for (s = 0, t = g.length; s < t; s++) {
					j = g[s];
					j.component.setSize(j.width, j.height)
				}
				if (q && q != "hidden" && !this.adjustmentPass) {
					var r = this.getLayoutTargetSize();
					if (r.width != p.width || r.height != p.height) {
						this.adjustmentPass = true;
						this.onLayout(m, w)
					}
				}
				delete this.adjustmentPass
			},
			parseAnchor : function (c, h, b) {
				if (c && c != "none") {
					var e;
					if (this.parseAnchorRE.test(c)) {
						var g = b - h;
						return function (a) {
							if (a !== e) {
								e = a;
								return a - g
							}
						}
					} else {
						if (c.indexOf("%") != -1) {
							var d = parseFloat(c.replace("%", "")) * 0.01;
							return function (a) {
								if (a !== e) {
									e = a;
									return Math.floor(a * d)
								}
							}
						} else {
							c = parseInt(c, 10);
							if (!isNaN(c)) {
								return function (a) {
									if (a !== e) {
										e = a;
										return a + c
									}
								}
							}
						}
					}
				}
				return false
			},
			adjustWidthAnchor : function (b, a) {
				return b
			},
			adjustHeightAnchor : function (b, a) {
				return b
			}
		});
Ext.Container.LAYOUTS.anchor = Ext.layout.AnchorLayout;
Ext.layout.ColumnLayout = Ext.extend(Ext.layout.ContainerLayout, {
			monitorResize : true,
			type : "column",
			extraCls : "x-column",
			scrollOffset : 0,
			targetCls : "x-column-layout-ct",
			isValidParent : function (b, a) {
				return this.innerCt && b.getPositionEl().dom.parentNode == this.innerCt.dom
			},
			getLayoutTargetSize : function () {
				var b = this.container.getLayoutTarget(),
				a;
				if (b) {
					a = b.getViewSize();
					if (Ext.isIE && Ext.isStrict && a.width == 0) {
						a = b.getStyleSize()
					}
					a.width -= b.getPadding("lr");
					a.height -= b.getPadding("tb")
				}
				return a
			},
			renderAll : function (a, b) {
				if (!this.innerCt) {
					this.innerCt = b.createChild({
								cls : "x-column-inner"
							});
					this.innerCt.createChild({
							cls : "x-clear"
						})
				}
				Ext.layout.ColumnLayout.superclass.renderAll.call(this, a, this.innerCt)
			},
			onLayout : function (e, k) {
				var g = e.items.items,
				j = g.length,
				n,
				b,
				a,
				o = [];
				this.renderAll(e, k);
				var r = this.getLayoutTargetSize();
				if (r.width < 1 && r.height < 1) {
					return
				}
				var p = r.width - this.scrollOffset,
				d = r.height,
				q = p;
				this.innerCt.setWidth(p);
				for (b = 0; b < j; b++) {
					n = g[b];
					a = n.getPositionEl().getMargins("lr");
					o[b] = a;
					if (!n.columnWidth) {
						q -= (n.getWidth() + a)
					}
				}
				q = q < 0 ? 0 : q;
				for (b = 0; b < j; b++) {
					n = g[b];
					a = o[b];
					if (n.columnWidth) {
						n.setSize(Math.floor(n.columnWidth * q) - a)
					}
				}
				if (Ext.isIE) {
					if (b = k.getStyle("overflow") && b != "hidden" && !this.adjustmentPass) {
						var l = this.getLayoutTargetSize();
						if (l.width != r.width) {
							this.adjustmentPass = true;
							this.onLayout(e, k)
						}
					}
				}
				delete this.adjustmentPass
			}
		});
Ext.Container.LAYOUTS.column = Ext.layout.ColumnLayout;
Ext.layout.BorderLayout = Ext.extend(Ext.layout.ContainerLayout, {
			monitorResize : true,
			rendered : false,
			type : "border",
			targetCls : "x-border-layout-ct",
			getLayoutTargetSize : function () {
				var a = this.container.getLayoutTarget();
				return a ? a.getViewSize() : {}
				
			},
			onLayout : function (g, I) {
				var j,
				B,
				F,
				o,
				x = g.items.items,
				C = x.length;
				if (!this.rendered) {
					j = [];
					for (B = 0; B < C; B++) {
						F = x[B];
						o = F.region;
						if (F.collapsed) {
							j.push(F)
						}
						F.collapsed = false;
						if (!F.rendered) {
							F.render(I, B);
							F.getPositionEl().addClass("x-border-panel")
						}
						this[o] = o != "center" && F.split ? new Ext.layout.BorderLayout.SplitRegion(this, F.initialConfig, o) : new Ext.layout.BorderLayout.Region(this, F.initialConfig, o);
						this[o].render(I, F)
					}
					this.rendered = true
				}
				var v = this.getLayoutTargetSize();
				if (v.width < 20 || v.height < 20) {
					if (j) {
						this.restoreCollapsed = j
					}
					return
				} else {
					if (this.restoreCollapsed) {
						j = this.restoreCollapsed;
						delete this.restoreCollapsed
					}
				}
				var t = v.width,
				D = v.height,
				r = t,
				A = D,
				p = 0,
				q = 0,
				y = this.north,
				u = this.south,
				l = this.west,
				E = this.east,
				F = this.center,
				H,
				z,
				d,
				G;
				if (!F && Ext.layout.BorderLayout.WARN !== false) {
					throw "No center region defined in BorderLayout " + g.id
				}
				if (y && y.isVisible()) {
					H = y.getSize();
					z = y.getMargins();
					H.width = t - (z.left + z.right);
					H.x = z.left;
					H.y = z.top;
					p = H.height + H.y + z.bottom;
					A -= p;
					y.applyLayout(H)
				}
				if (u && u.isVisible()) {
					H = u.getSize();
					z = u.getMargins();
					H.width = t - (z.left + z.right);
					H.x = z.left;
					G = (H.height + z.top + z.bottom);
					H.y = D - G + z.top;
					A -= G;
					u.applyLayout(H)
				}
				if (l && l.isVisible()) {
					H = l.getSize();
					z = l.getMargins();
					H.height = A - (z.top + z.bottom);
					H.x = z.left;
					H.y = p + z.top;
					d = (H.width + z.left + z.right);
					q += d;
					r -= d;
					l.applyLayout(H)
				}
				if (E && E.isVisible()) {
					H = E.getSize();
					z = E.getMargins();
					H.height = A - (z.top + z.bottom);
					d = (H.width + z.left + z.right);
					H.x = t - d + z.left;
					H.y = p + z.top;
					r -= d;
					E.applyLayout(H)
				}
				if (F) {
					z = F.getMargins();
					var k = {
						x : q + z.left,
						y : p + z.top,
						width : r - (z.left + z.right),
						height : A - (z.top + z.bottom)
					};
					F.applyLayout(k)
				}
				if (j) {
					for (B = 0, C = j.length; B < C; B++) {
						j[B].collapse(false)
					}
				}
				if (Ext.isIE && Ext.isStrict) {
					I.repaint()
				}
				if (B = I.getStyle("overflow") && B != "hidden" && !this.adjustmentPass) {
					var a = this.getLayoutTargetSize();
					if (a.width != v.width || a.height != v.height) {
						this.adjustmentPass = true;
						this.onLayout(g, I)
					}
				}
				delete this.adjustmentPass
			},
			destroy : function () {
				var b = ["north", "south", "east", "west"],
				a,
				c;
				for (a = 0; a < b.length; a++) {
					c = this[b[a]];
					if (c) {
						if (c.destroy) {
							c.destroy()
						} else {
							if (c.split) {
								c.split.destroy(true)
							}
						}
					}
				}
				Ext.layout.BorderLayout.superclass.destroy.call(this)
			}
		});
Ext.layout.BorderLayout.Region = function (b, a, c) {
	Ext.apply(this, a);
	this.layout = b;
	this.position = c;
	this.state = {};
	if (typeof this.margins == "string") {
		this.margins = this.layout.parseMargins(this.margins)
	}
	this.margins = Ext.applyIf(this.margins || {}, this.defaultMargins);
	if (this.collapsible) {
		if (typeof this.cmargins == "string") {
			this.cmargins = this.layout.parseMargins(this.cmargins)
		}
		if (this.collapseMode == "mini" && !this.cmargins) {
			this.cmargins = {
				left : 0,
				top : 0,
				right : 0,
				bottom : 0
			}
		} else {
			this.cmargins = Ext.applyIf(this.cmargins || {}, c == "north" || c == "south" ? this.defaultNSCMargins : this.defaultEWCMargins)
		}
	}
};
Ext.layout.BorderLayout.Region.prototype = {
	collapsible : false,
	split : false,
	floatable : true,
	minWidth : 50,
	minHeight : 50,
	defaultMargins : {
		left : 0,
		top : 0,
		right : 0,
		bottom : 0
	},
	defaultNSCMargins : {
		left : 5,
		top : 5,
		right : 5,
		bottom : 5
	},
	defaultEWCMargins : {
		left : 5,
		top : 0,
		right : 5,
		bottom : 0
	},
	floatingZIndex : 100,
	isCollapsed : false,
	render : function (b, c) {
		this.panel = c;
		c.el.enableDisplayMode();
		this.targetEl = b;
		this.el = c.el;
		var a = c.getState,
		d = this.position;
		c.getState = function () {
			return Ext.apply(a.call(c) || {}, this.state)
		}
		.createDelegate(this);
		if (d != "center") {
			c.allowQueuedExpand = false;
			c.on({
					beforecollapse : this.beforeCollapse,
					collapse : this.onCollapse,
					beforeexpand : this.beforeExpand,
					expand : this.onExpand,
					hide : this.onHide,
					show : this.onShow,
					scope : this
				});
			if (this.collapsible || this.floatable) {
				c.collapseEl = "el";
				c.slideAnchor = this.getSlideAnchor()
			}
			if (c.tools && c.tools.toggle) {
				c.tools.toggle.addClass("x-tool-collapse-" + d);
				c.tools.toggle.addClassOnOver("x-tool-collapse-" + d + "-over")
			}
		}
	},
	getCollapsedEl : function () {
		if (!this.collapsedEl) {
			if (!this.toolTemplate) {
				var b = new Ext.Template('<div class="x-tool x-tool-{id}">&#160;</div>');
				b.disableFormats = true;
				b.compile();
				Ext.layout.BorderLayout.Region.prototype.toolTemplate = b
			}
			this.collapsedEl = this.targetEl.createChild({
						cls : "x-layout-collapsed x-layout-collapsed-" + this.position,
						id : this.panel.id + "-xcollapsed"
					});
			this.collapsedEl.enableDisplayMode("block");
			if (this.collapseMode == "mini") {
				this.collapsedEl.addClass("x-layout-cmini-" + this.position);
				this.miniCollapsedEl = this.collapsedEl.createChild({
							cls : "x-layout-mini x-layout-mini-" + this.position,
							html : "&#160;"
						});
				this.miniCollapsedEl.addClassOnOver("x-layout-mini-over");
				this.collapsedEl.addClassOnOver("x-layout-collapsed-over");
				this.collapsedEl.on("click", this.onExpandClick, this, {
						stopEvent : true
					})
			} else {
				if (this.collapsible !== false && !this.hideCollapseTool) {
					var a = this.expandToolEl = this.toolTemplate.append(this.collapsedEl.dom, {
								id : "expand-" + this.position
							}, true);
					a.addClassOnOver("x-tool-expand-" + this.position + "-over");
					a.on("click", this.onExpandClick, this, {
							stopEvent : true
						})
				}
				if (this.floatable !== false || this.titleCollapse) {
					this.collapsedEl.addClassOnOver("x-layout-collapsed-over");
					this.collapsedEl.on("click", this[this.floatable ? "collapseClick" : "onExpandClick"], this)
				}
			}
		}
		return this.collapsedEl
	},
	onExpandClick : function (a) {
		if (this.isSlid) {
			this.panel.expand(false)
		} else {
			this.panel.expand()
		}
	},
	onCollapseClick : function (a) {
		this.panel.collapse()
	},
	beforeCollapse : function (c, a) {
		this.lastAnim = a;
		if (this.splitEl) {
			this.splitEl.hide()
		}
		this.getCollapsedEl().show();
		var b = this.panel.getEl();
		this.originalZIndex = b.getStyle("z-index");
		b.setStyle("z-index", 100);
		this.isCollapsed = true;
		this.layout.layout()
	},
	onCollapse : function (a) {
		this.panel.el.setStyle("z-index", 1);
		if (this.lastAnim === false || this.panel.animCollapse === false) {
			this.getCollapsedEl().dom.style.visibility = "visible"
		} else {
			this.getCollapsedEl().slideIn(this.panel.slideAnchor, {
					duration : 0.2
				})
		}
		this.state.collapsed = true;
		this.panel.saveState()
	},
	beforeExpand : function (a) {
		if (this.isSlid) {
			this.afterSlideIn()
		}
		var b = this.getCollapsedEl();
		this.el.show();
		if (this.position == "east" || this.position == "west") {
			this.panel.setSize(undefined, b.getHeight())
		} else {
			this.panel.setSize(b.getWidth(), undefined)
		}
		b.hide();
		b.dom.style.visibility = "hidden";
		this.panel.el.setStyle("z-index", this.floatingZIndex)
	},
	onExpand : function () {
		this.isCollapsed = false;
		if (this.splitEl) {
			this.splitEl.show()
		}
		this.layout.layout();
		this.panel.el.setStyle("z-index", this.originalZIndex);
		this.state.collapsed = false;
		this.panel.saveState()
	},
	collapseClick : function (a) {
		if (this.isSlid) {
			a.stopPropagation();
			this.slideIn()
		} else {
			a.stopPropagation();
			this.slideOut()
		}
	},
	onHide : function () {
		if (this.isCollapsed) {
			this.getCollapsedEl().hide()
		} else {
			if (this.splitEl) {
				this.splitEl.hide()
			}
		}
	},
	onShow : function () {
		if (this.isCollapsed) {
			this.getCollapsedEl().show()
		} else {
			if (this.splitEl) {
				this.splitEl.show()
			}
		}
	},
	isVisible : function () {
		return !this.panel.hidden
	},
	getMargins : function () {
		return this.isCollapsed && this.cmargins ? this.cmargins : this.margins
	},
	getSize : function () {
		return this.isCollapsed ? this.getCollapsedEl().getSize() : this.panel.getSize()
	},
	setPanel : function (a) {
		this.panel = a
	},
	getMinWidth : function () {
		return this.minWidth
	},
	getMinHeight : function () {
		return this.minHeight
	},
	applyLayoutCollapsed : function (a) {
		var b = this.getCollapsedEl();
		b.setLeftTop(a.x, a.y);
		b.setSize(a.width, a.height)
	},
	applyLayout : function (a) {
		if (this.isCollapsed) {
			this.applyLayoutCollapsed(a)
		} else {
			this.panel.setPosition(a.x, a.y);
			this.panel.setSize(a.width, a.height)
		}
	},
	beforeSlide : function () {
		this.panel.beforeEffect()
	},
	afterSlide : function () {
		this.panel.afterEffect()
	},
	initAutoHide : function () {
		if (this.autoHide !== false) {
			if (!this.autoHideHd) {
				this.autoHideSlideTask = new Ext.util.DelayedTask(this.slideIn, this);
				this.autoHideHd = {
					mouseout : function (a) {
						if (!a.within(this.el, true)) {
							this.autoHideSlideTask.delay(500)
						}
					},
					mouseover : function (a) {
						this.autoHideSlideTask.cancel()
					},
					scope : this
				}
			}
			this.el.on(this.autoHideHd);
			this.collapsedEl.on(this.autoHideHd)
		}
	},
	clearAutoHide : function () {
		if (this.autoHide !== false) {
			this.el.un("mouseout", this.autoHideHd.mouseout);
			this.el.un("mouseover", this.autoHideHd.mouseover);
			this.collapsedEl.un("mouseout", this.autoHideHd.mouseout);
			this.collapsedEl.un("mouseover", this.autoHideHd.mouseover)
		}
	},
	clearMonitor : function () {
		Ext.getDoc().un("click", this.slideInIf, this)
	},
	slideOut : function () {
		if (this.isSlid || this.el.hasActiveFx()) {
			return
		}
		this.isSlid = true;
		var b = this.panel.tools,
		c,
		a;
		if (b && b.toggle) {
			b.toggle.hide()
		}
		this.el.show();
		a = this.panel.collapsed;
		this.panel.collapsed = false;
		if (this.position == "east" || this.position == "west") {
			c = this.panel.deferHeight;
			this.panel.deferHeight = false;
			this.panel.setSize(undefined, this.collapsedEl.getHeight());
			this.panel.deferHeight = c
		} else {
			this.panel.setSize(this.collapsedEl.getWidth(), undefined)
		}
		this.panel.collapsed = a;
		this.restoreLT = [this.el.dom.style.left, this.el.dom.style.top];
		this.el.alignTo(this.collapsedEl, this.getCollapseAnchor());
		this.el.setStyle("z-index", this.floatingZIndex + 2);
		this.panel.el.replaceClass("x-panel-collapsed", "x-panel-floating");
		if (this.animFloat !== false) {
			this.beforeSlide();
			this.el.slideIn(this.getSlideAnchor(), {
					callback : function () {
						this.afterSlide();
						this.initAutoHide();
						Ext.getDoc().on("click", this.slideInIf, this)
					},
					scope : this,
					block : true
				})
		} else {
			this.initAutoHide();
			Ext.getDoc().on("click", this.slideInIf, this)
		}
	},
	afterSlideIn : function () {
		this.clearAutoHide();
		this.isSlid = false;
		this.clearMonitor();
		this.el.setStyle("z-index", "");
		this.panel.el.replaceClass("x-panel-floating", "x-panel-collapsed");
		this.el.dom.style.left = this.restoreLT[0];
		this.el.dom.style.top = this.restoreLT[1];
		var a = this.panel.tools;
		if (a && a.toggle) {
			a.toggle.show()
		}
	},
	slideIn : function (a) {
		if (!this.isSlid || this.el.hasActiveFx()) {
			Ext.callback(a);
			return
		}
		this.isSlid = false;
		if (this.animFloat !== false) {
			this.beforeSlide();
			this.el.slideOut(this.getSlideAnchor(), {
					callback : function () {
						this.el.hide();
						this.afterSlide();
						this.afterSlideIn();
						Ext.callback(a)
					},
					scope : this,
					block : true
				})
		} else {
			this.el.hide();
			this.afterSlideIn()
		}
	},
	slideInIf : function (a) {
		if (!a.within(this.el)) {
			this.slideIn()
		}
	},
	anchors : {
		west : "left",
		east : "right",
		north : "top",
		south : "bottom"
	},
	sanchors : {
		west : "l",
		east : "r",
		north : "t",
		south : "b"
	},
	canchors : {
		west : "tl-tr",
		east : "tr-tl",
		north : "tl-bl",
		south : "bl-tl"
	},
	getAnchor : function () {
		return this.anchors[this.position]
	},
	getCollapseAnchor : function () {
		return this.canchors[this.position]
	},
	getSlideAnchor : function () {
		return this.sanchors[this.position]
	},
	getAlignAdj : function () {
		var a = this.cmargins;
		switch (this.position) {
		case "west":
			return [0, 0];
			break;
		case "east":
			return [0, 0];
			break;
		case "north":
			return [0, 0];
			break;
		case "south":
			return [0, 0];
			break
		}
	},
	getExpandAdj : function () {
		var b = this.collapsedEl,
		a = this.cmargins;
		switch (this.position) {
		case "west":
			return [ - (a.right + b.getWidth() + a.left), 0];
			break;
		case "east":
			return [a.right + b.getWidth() + a.left, 0];
			break;
		case "north":
			return [0,  - (a.top + a.bottom + b.getHeight())];
			break;
		case "south":
			return [0, a.top + a.bottom + b.getHeight()];
			break
		}
	},
	destroy : function () {
		if (this.autoHideSlideTask && this.autoHideSlideTask.cancel) {
			this.autoHideSlideTask.cancel()
		}
		Ext.destroyMembers(this, "miniCollapsedEl", "collapsedEl", "expandToolEl")
	}
};
Ext.layout.BorderLayout.SplitRegion = function (b, a, c) {
	Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this, b, a, c);
	this.applyLayout = this.applyFns[c]
};
Ext.extend(Ext.layout.BorderLayout.SplitRegion, Ext.layout.BorderLayout.Region, {
		splitTip : "Drag to resize.",
		collapsibleSplitTip : "Drag to resize. Double click to hide.",
		useSplitTips : false,
		splitSettings : {
			north : {
				orientation : Ext.SplitBar.VERTICAL,
				placement : Ext.SplitBar.TOP,
				maxFn : "getVMaxSize",
				minProp : "minHeight",
				maxProp : "maxHeight"
			},
			south : {
				orientation : Ext.SplitBar.VERTICAL,
				placement : Ext.SplitBar.BOTTOM,
				maxFn : "getVMaxSize",
				minProp : "minHeight",
				maxProp : "maxHeight"
			},
			east : {
				orientation : Ext.SplitBar.HORIZONTAL,
				placement : Ext.SplitBar.RIGHT,
				maxFn : "getHMaxSize",
				minProp : "minWidth",
				maxProp : "maxWidth"
			},
			west : {
				orientation : Ext.SplitBar.HORIZONTAL,
				placement : Ext.SplitBar.LEFT,
				maxFn : "getHMaxSize",
				minProp : "minWidth",
				maxProp : "maxWidth"
			}
		},
		applyFns : {
			west : function (c) {
				if (this.isCollapsed) {
					return this.applyLayoutCollapsed(c)
				}
				var d = this.splitEl.dom,
				b = d.style;
				this.panel.setPosition(c.x, c.y);
				var a = d.offsetWidth;
				b.left = (c.x + c.width - a) + "px";
				b.top = (c.y) + "px";
				b.height = Math.max(0, c.height) + "px";
				this.panel.setSize(c.width - a, c.height)
			},
			east : function (c) {
				if (this.isCollapsed) {
					return this.applyLayoutCollapsed(c)
				}
				var d = this.splitEl.dom,
				b = d.style;
				var a = d.offsetWidth;
				this.panel.setPosition(c.x + a, c.y);
				b.left = (c.x) + "px";
				b.top = (c.y) + "px";
				b.height = Math.max(0, c.height) + "px";
				this.panel.setSize(c.width - a, c.height)
			},
			north : function (c) {
				if (this.isCollapsed) {
					return this.applyLayoutCollapsed(c)
				}
				var d = this.splitEl.dom,
				b = d.style;
				var a = d.offsetHeight;
				this.panel.setPosition(c.x, c.y);
				b.left = (c.x) + "px";
				b.top = (c.y + c.height - a) + "px";
				b.width = Math.max(0, c.width) + "px";
				this.panel.setSize(c.width, c.height - a)
			},
			south : function (c) {
				if (this.isCollapsed) {
					return this.applyLayoutCollapsed(c)
				}
				var d = this.splitEl.dom,
				b = d.style;
				var a = d.offsetHeight;
				this.panel.setPosition(c.x, c.y + a);
				b.left = (c.x) + "px";
				b.top = (c.y) + "px";
				b.width = Math.max(0, c.width) + "px";
				this.panel.setSize(c.width, c.height - a)
			}
		},
		render : function (a, c) {
			Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this, a, c);
			var d = this.position;
			this.splitEl = a.createChild({
						cls : "x-layout-split x-layout-split-" + d,
						html : "&#160;",
						id : this.panel.id + "-xsplit"
					});
			if (this.collapseMode == "mini") {
				this.miniSplitEl = this.splitEl.createChild({
							cls : "x-layout-mini x-layout-mini-" + d,
							html : "&#160;"
						});
				this.miniSplitEl.addClassOnOver("x-layout-mini-over");
				this.miniSplitEl.on("click", this.onCollapseClick, this, {
						stopEvent : true
					})
			}
			var b = this.splitSettings[d];
			this.split = new Ext.SplitBar(this.splitEl.dom, c.el, b.orientation);
			this.split.tickSize = this.tickSize;
			this.split.placement = b.placement;
			this.split.getMaximumSize = this[b.maxFn].createDelegate(this);
			this.split.minSize = this.minSize || this[b.minProp];
			this.split.on("beforeapply", this.onSplitMove, this);
			this.split.useShim = this.useShim === true;
			this.maxSize = this.maxSize || this[b.maxProp];
			if (c.hidden) {
				this.splitEl.hide()
			}
			if (this.useSplitTips) {
				this.splitEl.dom.title = this.collapsible ? this.collapsibleSplitTip : this.splitTip
			}
			if (this.collapsible) {
				this.splitEl.on("dblclick", this.onCollapseClick, this)
			}
		},
		getSize : function () {
			if (this.isCollapsed) {
				return this.collapsedEl.getSize()
			}
			var a = this.panel.getSize();
			if (this.position == "north" || this.position == "south") {
				a.height += this.splitEl.dom.offsetHeight
			} else {
				a.width += this.splitEl.dom.offsetWidth
			}
			return a
		},
		getHMaxSize : function () {
			var b = this.maxSize || 10000;
			var a = this.layout.center;
			return Math.min(b, (this.el.getWidth() + a.el.getWidth()) - a.getMinWidth())
		},
		getVMaxSize : function () {
			var b = this.maxSize || 10000;
			var a = this.layout.center;
			return Math.min(b, (this.el.getHeight() + a.el.getHeight()) - a.getMinHeight())
		},
		onSplitMove : function (b, a) {
			var c = this.panel.getSize();
			this.lastSplitSize = a;
			if (this.position == "north" || this.position == "south") {
				this.panel.setSize(c.width, a);
				this.state.height = a
			} else {
				this.panel.setSize(a, c.height);
				this.state.width = a
			}
			this.layout.layout();
			this.panel.saveState();
			return false
		},
		getSplitBar : function () {
			return this.split
		},
		destroy : function () {
			Ext.destroy(this.miniSplitEl, this.split, this.splitEl);
			Ext.layout.BorderLayout.SplitRegion.superclass.destroy.call(this)
		}
	});
Ext.Container.LAYOUTS.border = Ext.layout.BorderLayout;
Ext.layout.FormLayout = Ext.extend(Ext.layout.AnchorLayout, {
			labelSeparator : ":",
			trackLabels : true,
			type : "form",
			onRemove : function (d) {
				Ext.layout.FormLayout.superclass.onRemove.call(this, d);
				if (this.trackLabels) {
					d.un("show", this.onFieldShow, this);
					d.un("hide", this.onFieldHide, this)
				}
				var b = d.getPositionEl(),
				a = d.getItemCt && d.getItemCt();
				if (d.rendered && a) {
					if (b && b.dom) {
						b.insertAfter(a)
					}
					Ext.destroy(a);
					Ext.destroyMembers(d, "label", "itemCt");
					if (d.customItemCt) {
						Ext.destroyMembers(d, "getItemCt", "customItemCt")
					}
				}
			},
			setContainer : function (a) {
				Ext.layout.FormLayout.superclass.setContainer.call(this, a);
				if (a.labelAlign) {
					a.addClass("x-form-label-" + a.labelAlign)
				}
				if (a.hideLabels) {
					Ext.apply(this, {
							labelStyle : "display:none",
							elementStyle : "padding-left:0;",
							labelAdjust : 0
						})
				} else {
					this.labelSeparator = Ext.isDefined(a.labelSeparator) ? a.labelSeparator : this.labelSeparator;
					a.labelWidth = a.labelWidth || 100;
					if (Ext.isNumber(a.labelWidth)) {
						var b = Ext.isNumber(a.labelPad) ? a.labelPad : 5;
						Ext.apply(this, {
								labelAdjust : a.labelWidth + b,
								labelStyle : "width:" + a.labelWidth + "px;",
								elementStyle : "padding-left:" + (a.labelWidth + b) + "px"
							})
					}
					if (a.labelAlign == "top") {
						Ext.apply(this, {
								labelStyle : "width:auto;",
								labelAdjust : 0,
								elementStyle : "padding-left:0;"
							})
					}
				}
			},
			isHide : function (a) {
				return a.hideLabel || this.container.hideLabels
			},
			onFieldShow : function (a) {
				a.getItemCt().removeClass("x-hide-" + a.hideMode);
				if (a.isComposite) {
					a.doLayout()
				}
			},
			onFieldHide : function (a) {
				a.getItemCt().addClass("x-hide-" + a.hideMode)
			},
			getLabelStyle : function (e) {
				var b = "",
				c = [this.labelStyle, e];
				for (var d = 0, a = c.length; d < a; ++d) {
					if (c[d]) {
						b += c[d];
						if (b.substr(-1, 1) != ";") {
							b += ";"
						}
					}
				}
				return b
			},
			renderItem : function (e, a, d) {
				if (e && (e.isFormField || e.fieldLabel) && e.inputType != "hidden") {
					var b = this.getTemplateArgs(e);
					if (Ext.isNumber(a)) {
						a = d.dom.childNodes[a] || null
					}
					if (a) {
						e.itemCt = this.fieldTpl.insertBefore(a, b, true)
					} else {
						e.itemCt = this.fieldTpl.append(d, b, true)
					}
					if (!e.getItemCt) {
						Ext.apply(e, {
								getItemCt : function () {
									return e.itemCt
								},
								customItemCt : true
							})
					}
					e.label = e.getItemCt().child("label.x-form-item-label");
					if (!e.rendered) {
						e.render("x-form-el-" + e.id)
					} else {
						if (!this.isValidParent(e, d)) {
							Ext.fly("x-form-el-" + e.id).appendChild(e.getPositionEl())
						}
					}
					if (this.trackLabels) {
						if (e.hidden) {
							this.onFieldHide(e)
						}
						e.on({
								scope : this,
								show : this.onFieldShow,
								hide : this.onFieldHide
							})
					}
					this.configureItem(e)
				} else {
					Ext.layout.FormLayout.superclass.renderItem.apply(this, arguments)
				}
			},
			getTemplateArgs : function (c) {
				var a = !c.fieldLabel || c.hideLabel,
				b = (c.itemCls || this.container.itemCls || "") + (c.hideLabel ? " x-hide-label" : "");
				if (Ext.isIE9 && Ext.isIEQuirks && c instanceof Ext.form.TextField) {
					b += " x-input-wrapper"
				}
				return {
					id : c.id,
					label : c.fieldLabel,
					itemCls : b,
					clearCls : c.clearCls || "x-form-clear-left",
					labelStyle : this.getLabelStyle(c.labelStyle),
					elementStyle : this.elementStyle || "",
					labelSeparator : a ? "" : (Ext.isDefined(c.labelSeparator) ? c.labelSeparator : this.labelSeparator)
				}
			},
			adjustWidthAnchor : function (a, d) {
				if (d.label && !this.isHide(d) && (this.container.labelAlign != "top")) {
					var b = Ext.isIE6 || (Ext.isIE && !Ext.isStrict);
					return a - this.labelAdjust + (b ? -3 : 0)
				}
				return a
			},
			adjustHeightAnchor : function (a, b) {
				if (b.label && !this.isHide(b) && (this.container.labelAlign == "top")) {
					return a - b.label.getHeight()
				}
				return a
			},
			isValidParent : function (b, a) {
				return a && this.container.getEl().contains(b.getPositionEl())
			}
		});
Ext.Container.LAYOUTS.form = Ext.layout.FormLayout;
Ext.layout.AccordionLayout = Ext.extend(Ext.layout.FitLayout, {
			fill : true,
			autoWidth : true,
			titleCollapse : true,
			hideCollapseTool : false,
			collapseFirst : false,
			animate : false,
			sequence : false,
			activeOnTop : false,
			type : "accordion",
			renderItem : function (a) {
				if (this.animate === false) {
					a.animCollapse = false
				}
				a.collapsible = true;
				if (this.autoWidth) {
					a.autoWidth = true
				}
				if (this.titleCollapse) {
					a.titleCollapse = true
				}
				if (this.hideCollapseTool) {
					a.hideCollapseTool = true
				}
				if (this.collapseFirst !== undefined) {
					a.collapseFirst = this.collapseFirst
				}
				if (!this.activeItem && !a.collapsed) {
					this.setActiveItem(a, true)
				} else {
					if (this.activeItem && this.activeItem != a) {
						a.collapsed = true
					}
				}
				Ext.layout.AccordionLayout.superclass.renderItem.apply(this, arguments);
				a.header.addClass("x-accordion-hd");
				a.on("beforeexpand", this.beforeExpand, this)
			},
			onRemove : function (a) {
				Ext.layout.AccordionLayout.superclass.onRemove.call(this, a);
				if (a.rendered) {
					a.header.removeClass("x-accordion-hd")
				}
				a.un("beforeexpand", this.beforeExpand, this)
			},
			beforeExpand : function (c, b) {
				var a = this.activeItem;
				if (a) {
					if (this.sequence) {
						delete this.activeItem;
						if (!a.collapsed) {
							a.collapse({
									callback : function () {
										c.expand(b || true)
									},
									scope : this
								});
							return false
						}
					} else {
						a.collapse(this.animate)
					}
				}
				this.setActive(c);
				if (this.activeOnTop) {
					c.el.dom.parentNode.insertBefore(c.el.dom, c.el.dom.parentNode.firstChild)
				}
				this.layout()
			},
			setItemSize : function (g, e) {
				if (this.fill && g) {
					var d = 0,
					c,
					b = this.getRenderedItems(this.container),
					a = b.length,
					h;
					for (c = 0; c < a; c++) {
						if ((h = b[c]) != g && !h.hidden) {
							d += h.header.getHeight()
						}
					}
					e.height -= d;
					g.setSize(e)
				}
			},
			setActiveItem : function (a) {
				this.setActive(a, true)
			},
			setActive : function (c, b) {
				var a = this.activeItem;
				c = this.container.getComponent(c);
				if (a != c) {
					if (c.rendered && c.collapsed && b) {
						c.expand()
					} else {
						if (a) {
							a.fireEvent("deactivate", a)
						}
						this.activeItem = c;
						c.fireEvent("activate", c)
					}
				}
			}
		});
Ext.Container.LAYOUTS.accordion = Ext.layout.AccordionLayout;
Ext.layout.Accordion = Ext.layout.AccordionLayout;
Ext.layout.TableLayout = Ext.extend(Ext.layout.ContainerLayout, {
			monitorResize : false,
			type : "table",
			targetCls : "x-table-layout-ct",
			tableAttrs : null,
			setContainer : function (a) {
				Ext.layout.TableLayout.superclass.setContainer.call(this, a);
				this.currentRow = 0;
				this.currentColumn = 0;
				this.cells = []
			},
			onLayout : function (d, g) {
				var e = d.items.items,
				a = e.length,
				h,
				b;
				if (!this.table) {
					g.addClass("x-table-layout-ct");
					this.table = g.createChild(Ext.apply({
									tag : "table",
									cls : "x-table-layout",
									cellspacing : 0,
									cn : {
										tag : "tbody"
									}
								}, this.tableAttrs), null, true)
				}
				this.renderAll(d, g)
			},
			getRow : function (a) {
				var b = this.table.tBodies[0].childNodes[a];
				if (!b) {
					b = document.createElement("tr");
					this.table.tBodies[0].appendChild(b)
				}
				return b
			},
			getNextCell : function (j) {
				var a = this.getNextNonSpan(this.currentColumn, this.currentRow);
				var g = this.currentColumn = a[0],
				e = this.currentRow = a[1];
				for (var i = e; i < e + (j.rowspan || 1); i++) {
					if (!this.cells[i]) {
						this.cells[i] = []
					}
					for (var d = g; d < g + (j.colspan || 1); d++) {
						this.cells[i][d] = true
					}
				}
				var h = document.createElement("td");
				if (j.cellId) {
					h.id = j.cellId
				}
				var b = "x-table-layout-cell";
				if (j.cellCls) {
					b += " " + j.cellCls
				}
				h.className = b;
				if (j.colspan) {
					h.colSpan = j.colspan
				}
				if (j.rowspan) {
					h.rowSpan = j.rowspan
				}
				this.getRow(e).appendChild(h);
				return h
			},
			getNextNonSpan : function (a, c) {
				var b = this.columns;
				while ((b && a >= b) || (this.cells[c] && this.cells[c][a])) {
					if (b && a >= b) {
						c++;
						a = 0
					} else {
						a++
					}
				}
				return [a, c]
			},
			renderItem : function (e, a, d) {
				if (!this.table) {
					this.table = d.createChild(Ext.apply({
									tag : "table",
									cls : "x-table-layout",
									cellspacing : 0,
									cn : {
										tag : "tbody"
									}
								}, this.tableAttrs), null, true)
				}
				if (e && !e.rendered) {
					e.render(this.getNextCell(e));
					this.configureItem(e)
				} else {
					if (e && !this.isValidParent(e, d)) {
						var b = this.getNextCell(e);
						b.insertBefore(e.getPositionEl().dom, null);
						e.container = Ext.get(b);
						this.configureItem(e)
					}
				}
			},
			isValidParent : function (b, a) {
				return b.getPositionEl().up("table", 5).dom.parentNode === (a.dom || a)
			},
			destroy : function () {
				delete this.table;
				Ext.layout.TableLayout.superclass.destroy.call(this)
			}
		});
Ext.Container.LAYOUTS.table = Ext.layout.TableLayout;
Ext.layout.AbsoluteLayout = Ext.extend(Ext.layout.AnchorLayout, {
			extraCls : "x-abs-layout-item",
			type : "absolute",
			onLayout : function (a, b) {
				b.position();
				this.paddingLeft = b.getPadding("l");
				this.paddingTop = b.getPadding("t");
				Ext.layout.AbsoluteLayout.superclass.onLayout.call(this, a, b)
			},
			adjustWidthAnchor : function (b, a) {
				return b ? b - a.getPosition(true)[0] + this.paddingLeft : b
			},
			adjustHeightAnchor : function (b, a) {
				return b ? b - a.getPosition(true)[1] + this.paddingTop : b
			}
		});
Ext.Container.LAYOUTS.absolute = Ext.layout.AbsoluteLayout;
Ext.layout.BoxLayout = Ext.extend(Ext.layout.ContainerLayout, {
			defaultMargins : {
				left : 0,
				top : 0,
				right : 0,
				bottom : 0
			},
			padding : "0",
			pack : "start",
			monitorResize : true,
			type : "box",
			scrollOffset : 0,
			extraCls : "x-box-item",
			targetCls : "x-box-layout-ct",
			innerCls : "x-box-inner",
			constructor : function (a) {
				Ext.layout.BoxLayout.superclass.constructor.call(this, a);
				if (Ext.isString(this.defaultMargins)) {
					this.defaultMargins = this.parseMargins(this.defaultMargins)
				}
				var d = this.overflowHandler;
				if (typeof d == "string") {
					d = {
						type : d
					}
				}
				var c = "none";
				if (d && d.type != undefined) {
					c = d.type
				}
				var b = Ext.layout.boxOverflow[c];
				if (b[this.type]) {
					b = b[this.type]
				}
				this.overflowHandler = new b(this, d)
			},
			onLayout : function (b, h) {
				Ext.layout.BoxLayout.superclass.onLayout.call(this, b, h);
				var d = this.getLayoutTargetSize(),
				i = this.getVisibleItems(b),
				c = this.calculateChildBoxes(i, d),
				g = c.boxes,
				j = c.meta;
				if (d.width > 0) {
					var k = this.overflowHandler,
					a = j.tooNarrow ? "handleOverflow" : "clearOverflow";
					var e = k[a](c, d);
					if (e) {
						if (e.targetSize) {
							d = e.targetSize
						}
						if (e.recalculate) {
							i = this.getVisibleItems(b);
							c = this.calculateChildBoxes(i, d);
							g = c.boxes
						}
					}
				}
				this.layoutTargetLastSize = d;
				this.childBoxCache = c;
				this.updateInnerCtSize(d, c);
				this.updateChildBoxes(g);
				this.handleTargetOverflow(d, b, h)
			},
			updateChildBoxes : function (c) {
				for (var b = 0, e = c.length; b < e; b++) {
					var d = c[b],
					a = d.component;
					if (d.dirtySize) {
						a.setSize(d.width, d.height)
					}
					if (isNaN(d.left) || isNaN(d.top)) {
						continue
					}
					a.setPosition(d.left, d.top)
				}
			},
			updateInnerCtSize : function (c, h) {
				var i = this.align,
				g = this.padding,
				e = c.width,
				a = c.height;
				if (this.type == "hbox") {
					var b = e,
					d = h.meta.maxHeight + g.top + g.bottom;
					if (i == "stretch") {
						d = a
					} else {
						if (i == "middle") {
							d = Math.max(a, d)
						}
					}
				} else {
					var d = a,
					b = h.meta.maxWidth + g.left + g.right;
					if (i == "stretch") {
						b = e
					} else {
						if (i == "center") {
							b = Math.max(e, b)
						}
					}
				}
				this.innerCt.setSize(b || undefined, d || undefined)
			},
			handleTargetOverflow : function (d, a, c) {
				var e = c.getStyle("overflow");
				if (e && e != "hidden" && !this.adjustmentPass) {
					var b = this.getLayoutTargetSize();
					if (b.width != d.width || b.height != d.height) {
						this.adjustmentPass = true;
						this.onLayout(a, c)
					}
				}
				delete this.adjustmentPass
			},
			isValidParent : function (b, a) {
				return this.innerCt && b.getPositionEl().dom.parentNode == this.innerCt.dom
			},
			getVisibleItems : function (g) {
				var g = g || this.container,
				e = g.getLayoutTarget(),
				h = g.items.items,
				a = h.length,
				d,
				j,
				b = [];
				for (d = 0; d < a; d++) {
					if ((j = h[d]).rendered && this.isValidParent(j, e) && j.hidden !== true && j.collapsed !== true && j.shouldLayout !== false) {
						b.push(j)
					}
				}
				return b
			},
			renderAll : function (a, b) {
				if (!this.innerCt) {
					this.innerCt = b.createChild({
								cls : this.innerCls
							});
					this.padding = this.parseMargins(this.padding)
				}
				Ext.layout.BoxLayout.superclass.renderAll.call(this, a, this.innerCt)
			},
			getLayoutTargetSize : function () {
				var b = this.container.getLayoutTarget(),
				a;
				if (b) {
					a = b.getViewSize();
					if (Ext.isIE && Ext.isStrict && a.width == 0) {
						a = b.getStyleSize()
					}
					a.width -= b.getPadding("lr");
					a.height -= b.getPadding("tb")
				}
				return a
			},
			renderItem : function (a) {
				if (Ext.isString(a.margins)) {
					a.margins = this.parseMargins(a.margins)
				} else {
					if (!a.margins) {
						a.margins = this.defaultMargins
					}
				}
				Ext.layout.BoxLayout.superclass.renderItem.apply(this, arguments)
			},
			destroy : function () {
				Ext.destroy(this.overflowHandler);
				Ext.layout.BoxLayout.superclass.destroy.apply(this, arguments)
			}
		});
Ext.layout.boxOverflow.None = Ext.extend(Object, {
			constructor : function (b, a) {
				this.layout = b;
				Ext.apply(this, a || {})
			},
			handleOverflow : Ext.emptyFn,
			clearOverflow : Ext.emptyFn
		});
Ext.layout.boxOverflow.none = Ext.layout.boxOverflow.None;
Ext.layout.boxOverflow.Menu = Ext.extend(Ext.layout.boxOverflow.None, {
			afterCls : "x-strip-right",
			noItemsMenuText : '<div class="x-toolbar-no-items">(None)</div>',
			constructor : function (a) {
				Ext.layout.boxOverflow.Menu.superclass.constructor.apply(this, arguments);
				this.menuItems = []
			},
			createInnerElements : function () {
				if (!this.afterCt) {
					this.afterCt = this.layout.innerCt.insertSibling({
								cls : this.afterCls
							}, "before")
				}
			},
			clearOverflow : function (a, g) {
				var e = g.width + (this.afterCt ? this.afterCt.getWidth() : 0),
				b = this.menuItems;
				this.hideTrigger();
				for (var c = 0, d = b.length; c < d; c++) {
					b.pop().component.show()
				}
				return {
					targetSize : {
						height : g.height,
						width : e
					}
				}
			},
			showTrigger : function () {
				this.createMenu();
				this.menuTrigger.show()
			},
			hideTrigger : function () {
				if (this.menuTrigger != undefined) {
					this.menuTrigger.hide()
				}
			},
			beforeMenuShow : function (h) {
				var b = this.menuItems,
				a = b.length,
				g,
				e;
				var c = function (j, i) {
					return j.isXType("buttongroup") && !(i instanceof Ext.Toolbar.Separator)
				};
				this.clearMenu();
				h.removeAll();
				for (var d = 0; d < a; d++) {
					g = b[d].component;
					if (e && (c(g, e) || c(e, g))) {
						h.add("-")
					}
					this.addComponentToMenu(h, g);
					e = g
				}
				if (h.items.length < 1) {
					h.add(this.noItemsMenuText)
				}
			},
			createMenuConfig : function (c, a) {
				var b = Ext.apply({}, c.initialConfig),
				d = c.toggleGroup;
				Ext.copyTo(b, c, ["iconCls", "icon", "itemId", "disabled", "handler", "scope", "menu"]);
				Ext.apply(b, {
						text : c.overflowText || c.text,
						hideOnClick : a
					});
				if (d || c.enableToggle) {
					Ext.apply(b, {
							group : d,
							checked : c.pressed,
							listeners : {
								checkchange : function (g, e) {
									c.toggle(e)
								}
							}
						})
				}
				delete b.ownerCt;
				delete b.xtype;
				delete b.id;
				return b
			},
			addComponentToMenu : function (b, a) {
				if (a instanceof Ext.Toolbar.Separator) {
					b.add("-")
				} else {
					if (Ext.isFunction(a.isXType)) {
						if (a.isXType("splitbutton")) {
							b.add(this.createMenuConfig(a, true))
						} else {
							if (a.isXType("button")) {
								b.add(this.createMenuConfig(a, !a.menu))
							} else {
								if (a.isXType("buttongroup")) {
									a.items.each(function (c) {
											this.addComponentToMenu(b, c)
										}, this)
								}
							}
						}
					}
				}
			},
			clearMenu : function () {
				var a = this.moreMenu;
				if (a && a.items) {
					a.items.each(function (b) {
							delete b.menu
						})
				}
			},
			createMenu : function () {
				if (!this.menuTrigger) {
					this.createInnerElements();
					this.menu = new Ext.menu.Menu({
								ownerCt : this.layout.container,
								listeners : {
									scope : this,
									beforeshow : this.beforeMenuShow
								}
							});
					this.menuTrigger = new Ext.Button({
								iconCls : "x-toolbar-more-icon",
								cls : "x-toolbar-more",
								menu : this.menu,
								renderTo : this.afterCt
							})
				}
			},
			destroy : function () {
				Ext.destroy(this.menu, this.menuTrigger)
			}
		});
Ext.layout.boxOverflow.menu = Ext.layout.boxOverflow.Menu;
Ext.layout.boxOverflow.HorizontalMenu = Ext.extend(Ext.layout.boxOverflow.Menu, {
			constructor : function () {
				Ext.layout.boxOverflow.HorizontalMenu.superclass.constructor.apply(this, arguments);
				var c = this,
				b = c.layout,
				a = b.calculateChildBoxes;
				b.calculateChildBoxes = function (d, i) {
					var l = a.apply(b, arguments),
					k = l.meta,
					e = c.menuItems;
					var j = 0;
					for (var g = 0, h = e.length; g < h; g++) {
						j += e[g].width
					}
					k.minimumWidth += j;
					k.tooNarrow = k.minimumWidth > i.width;
					return l
				}
			},
			handleOverflow : function (d, h) {
				this.showTrigger();
				var k = h.width - this.afterCt.getWidth(),
				l = d.boxes,
				e = 0,
				r = false;
				for (var o = 0, c = l.length; o < c; o++) {
					e += l[o].width
				}
				var a = k - e,
				g = 0;
				for (var o = 0, c = this.menuItems.length; o < c; o++) {
					var n = this.menuItems[o],
					m = n.component,
					b = n.width;
					if (b < a) {
						m.show();
						a -= b;
						g++;
						r = true
					} else {
						break
					}
				}
				if (r) {
					this.menuItems = this.menuItems.slice(g)
				} else {
					for (var j = l.length - 1; j >= 0; j--) {
						var q = l[j].component,
						p = l[j].left + l[j].width;
						if (p >= k) {
							this.menuItems.unshift({
									component : q,
									width : l[j].width
								});
							q.hide()
						} else {
							break
						}
					}
				}
				if (this.menuItems.length == 0) {
					this.hideTrigger()
				}
				return {
					targetSize : {
						height : h.height,
						width : k
					},
					recalculate : r
				}
			}
		});
Ext.layout.boxOverflow.menu.hbox = Ext.layout.boxOverflow.HorizontalMenu;
Ext.layout.boxOverflow.Scroller = Ext.extend(Ext.layout.boxOverflow.None, {
			animateScroll : true,
			scrollIncrement : 100,
			wheelIncrement : 3,
			scrollRepeatInterval : 400,
			scrollDuration : 0.4,
			beforeCls : "x-strip-left",
			afterCls : "x-strip-right",
			scrollerCls : "x-strip-scroller",
			beforeScrollerCls : "x-strip-scroller-left",
			afterScrollerCls : "x-strip-scroller-right",
			createWheelListener : function () {
				this.layout.innerCt.on({
						scope : this,
						mousewheel : function (a) {
							a.stopEvent();
							this.scrollBy(a.getWheelDelta() * this.wheelIncrement * -1, false)
						}
					})
			},
			handleOverflow : function (a, b) {
				this.createInnerElements();
				this.showScrollers()
			},
			clearOverflow : function () {
				this.hideScrollers()
			},
			showScrollers : function () {
				this.createScrollers();
				this.beforeScroller.show();
				this.afterScroller.show();
				this.updateScrollButtons()
			},
			hideScrollers : function () {
				if (this.beforeScroller != undefined) {
					this.beforeScroller.hide();
					this.afterScroller.hide()
				}
			},
			createScrollers : function () {
				if (!this.beforeScroller && !this.afterScroller) {
					var a = this.beforeCt.createChild({
								cls : String.format("{0} {1} ", this.scrollerCls, this.beforeScrollerCls)
							});
					var b = this.afterCt.createChild({
								cls : String.format("{0} {1}", this.scrollerCls, this.afterScrollerCls)
							});
					a.addClassOnOver(this.beforeScrollerCls + "-hover");
					b.addClassOnOver(this.afterScrollerCls + "-hover");
					a.setVisibilityMode(Ext.Element.DISPLAY);
					b.setVisibilityMode(Ext.Element.DISPLAY);
					this.beforeRepeater = new Ext.util.ClickRepeater(a, {
								interval : this.scrollRepeatInterval,
								handler : this.scrollLeft,
								scope : this
							});
					this.afterRepeater = new Ext.util.ClickRepeater(b, {
								interval : this.scrollRepeatInterval,
								handler : this.scrollRight,
								scope : this
							});
					this.beforeScroller = a;
					this.afterScroller = b
				}
			},
			destroy : function () {
				Ext.destroy(this.beforeScroller, this.afterScroller, this.beforeRepeater, this.afterRepeater, this.beforeCt, this.afterCt)
			},
			scrollBy : function (b, a) {
				this.scrollTo(this.getScrollPosition() + b, a)
			},
			getItem : function (a) {
				if (Ext.isString(a)) {
					a = Ext.getCmp(a)
				} else {
					if (Ext.isNumber(a)) {
						a = this.items[a]
					}
				}
				return a
			},
			getScrollAnim : function () {
				return {
					duration : this.scrollDuration,
					callback : this.updateScrollButtons,
					scope : this
				}
			},
			updateScrollButtons : function () {
				if (this.beforeScroller == undefined || this.afterScroller == undefined) {
					return
				}
				var d = this.atExtremeBefore() ? "addClass" : "removeClass",
				c = this.atExtremeAfter() ? "addClass" : "removeClass",
				a = this.beforeScrollerCls + "-disabled",
				b = this.afterScrollerCls + "-disabled";
				this.beforeScroller[d](a);
				this.afterScroller[c](b);
				this.scrolling = false
			},
			atExtremeBefore : function () {
				return this.getScrollPosition() === 0
			},
			scrollLeft : function (a) {
				this.scrollBy(-this.scrollIncrement, a)
			},
			scrollRight : function (a) {
				this.scrollBy(this.scrollIncrement, a)
			},
			scrollToItem : function (d, b) {
				d = this.getItem(d);
				if (d != undefined) {
					var a = this.getItemVisibility(d);
					if (!a.fullyVisible) {
						var c = d.getBox(true, true),
						e = c.x;
						if (a.hiddenRight) {
							e -= (this.layout.innerCt.getWidth() - c.width)
						}
						this.scrollTo(e, b)
					}
				}
			},
			getItemVisibility : function (e) {
				var d = this.getItem(e).getBox(true, true),
				a = d.x,
				c = d.x + d.width,
				g = this.getScrollPosition(),
				b = this.layout.innerCt.getWidth() + g;
				return {
					hiddenLeft : a < g,
					hiddenRight : c > b,
					fullyVisible : a > g && c < b
				}
			}
		});
Ext.layout.boxOverflow.scroller = Ext.layout.boxOverflow.Scroller;
Ext.layout.boxOverflow.VerticalScroller = Ext.extend(Ext.layout.boxOverflow.Scroller, {
			scrollIncrement : 75,
			wheelIncrement : 2,
			handleOverflow : function (a, b) {
				Ext.layout.boxOverflow.VerticalScroller.superclass.handleOverflow.apply(this, arguments);
				return {
					targetSize : {
						height : b.height - (this.beforeCt.getHeight() + this.afterCt.getHeight()),
						width : b.width
					}
				}
			},
			createInnerElements : function () {
				var a = this.layout.innerCt;
				if (!this.beforeCt) {
					this.beforeCt = a.insertSibling({
								cls : this.beforeCls
							}, "before");
					this.afterCt = a.insertSibling({
								cls : this.afterCls
							}, "after");
					this.createWheelListener()
				}
			},
			scrollTo : function (a, b) {
				var d = this.getScrollPosition(),
				c = a.constrain(0, this.getMaxScrollBottom());
				if (c != d && !this.scrolling) {
					if (b == undefined) {
						b = this.animateScroll
					}
					this.layout.innerCt.scrollTo("top", c, b ? this.getScrollAnim() : false);
					if (b) {
						this.scrolling = true
					} else {
						this.scrolling = false;
						this.updateScrollButtons()
					}
				}
			},
			getScrollPosition : function () {
				return parseInt(this.layout.innerCt.dom.scrollTop, 10) || 0
			},
			getMaxScrollBottom : function () {
				return this.layout.innerCt.dom.scrollHeight - this.layout.innerCt.getHeight()
			},
			atExtremeAfter : function () {
				return this.getScrollPosition() >= this.getMaxScrollBottom()
			}
		});
Ext.layout.boxOverflow.scroller.vbox = Ext.layout.boxOverflow.VerticalScroller;
Ext.layout.boxOverflow.HorizontalScroller = Ext.extend(Ext.layout.boxOverflow.Scroller, {
			handleOverflow : function (a, b) {
				Ext.layout.boxOverflow.HorizontalScroller.superclass.handleOverflow.apply(this, arguments);
				return {
					targetSize : {
						height : b.height,
						width : b.width - (this.beforeCt.getWidth() + this.afterCt.getWidth())
					}
				}
			},
			createInnerElements : function () {
				var a = this.layout.innerCt;
				if (!this.beforeCt) {
					this.afterCt = a.insertSibling({
								cls : this.afterCls
							}, "before");
					this.beforeCt = a.insertSibling({
								cls : this.beforeCls
							}, "before");
					this.createWheelListener()
				}
			},
			scrollTo : function (a, b) {
				var d = this.getScrollPosition(),
				c = a.constrain(0, this.getMaxScrollRight());
				if (c != d && !this.scrolling) {
					if (b == undefined) {
						b = this.animateScroll
					}
					this.layout.innerCt.scrollTo("left", c, b ? this.getScrollAnim() : false);
					if (b) {
						this.scrolling = true
					} else {
						this.scrolling = false;
						this.updateScrollButtons()
					}
				}
			},
			getScrollPosition : function () {
				return parseInt(this.layout.innerCt.dom.scrollLeft, 10) || 0
			},
			getMaxScrollRight : function () {
				return this.layout.innerCt.dom.scrollWidth - this.layout.innerCt.getWidth()
			},
			atExtremeAfter : function () {
				return this.getScrollPosition() >= this.getMaxScrollRight()
			}
		});
Ext.layout.boxOverflow.scroller.hbox = Ext.layout.boxOverflow.HorizontalScroller;
Ext.layout.HBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
			align : "top",
			type : "hbox",
			calculateChildBoxes : function (r, b) {
				var F = r.length,
				R = this.padding,
				D = R.top,
				U = R.left,
				y = D + R.bottom,
				O = U + R.right,
				a = b.width - this.scrollOffset,
				e = b.height,
				o = Math.max(0, e - y),
				P = this.pack == "start",
				W = this.pack == "center",
				A = this.pack == "end",
				L = 0,
				Q = 0,
				T = 0,
				l = 0,
				X = 0,
				H = [],
				k,
				J,
				M,
				V,
				w,
				j,
				S,
				I,
				c,
				x,
				q,
				N;
				for (S = 0; S < F; S++) {
					k = r[S];
					M = k.height;
					J = k.width;
					j = !k.hasLayout && typeof k.doLayout == "function";
					if (typeof J != "number") {
						if (k.flex && !J) {
							T += k.flex
						} else {
							if (!J && j) {
								k.doLayout()
							}
							V = k.getSize();
							J = V.width;
							M = V.height
						}
					}
					w = k.margins;
					x = w.left + w.right;
					L += x + (J || 0);
					l += x + (k.flex ? k.minWidth || 0 : J);
					X += x + (k.minWidth || J || 0);
					if (typeof M != "number") {
						if (j) {
							k.doLayout()
						}
						M = k.getHeight()
					}
					Q = Math.max(Q, M + w.top + w.bottom);
					H.push({
							component : k,
							height : M || undefined,
							width : J || undefined
						})
				}
				var K = l - a,
				p = X > a;
				var n = Math.max(0, a - L - O);
				if (p) {
					for (S = 0; S < F; S++) {
						H[S].width = r[S].minWidth || r[S].width || H[S].width
					}
				} else {
					if (K > 0) {
						var C = [];
						for (var E = 0, v = F; E < v; E++) {
							var B = r[E],
							t = B.minWidth || 0;
							if (B.flex) {
								H[E].width = t
							} else {
								C.push({
										minWidth : t,
										available : H[E].width - t,
										index : E
									})
							}
						}
						C.sort(function (Y, i) {
								return Y.available > i.available ? 1 : -1
							});
						for (var S = 0, v = C.length; S < v; S++) {
							var G = C[S].index;
							if (G == undefined) {
								continue
							}
							var B = r[G],
							m = H[G],
							u = m.width,
							t = B.minWidth,
							d = Math.max(t, u - Math.ceil(K / (v - S))),
							g = u - d;
							H[G].width = d;
							K -= g
						}
					} else {
						var h = n,
						s = T;
						for (S = 0; S < F; S++) {
							k = r[S];
							I = H[S];
							w = k.margins;
							q = w.top + w.bottom;
							if (P && k.flex && !k.width) {
								c = Math.ceil((k.flex / s) * h);
								h -= c;
								s -= k.flex;
								I.width = c;
								I.dirtySize = true
							}
						}
					}
				}
				if (W) {
					U += n / 2
				} else {
					if (A) {
						U += n
					}
				}
				for (S = 0; S < F; S++) {
					k = r[S];
					I = H[S];
					w = k.margins;
					U += w.left;
					q = w.top + w.bottom;
					I.left = U;
					I.top = D + w.top;
					switch (this.align) {
					case "stretch":
						N = o - q;
						I.height = N.constrain(k.minHeight || 0, k.maxHeight || 1000000);
						I.dirtySize = true;
						break;
					case "stretchmax":
						N = Q - q;
						I.height = N.constrain(k.minHeight || 0, k.maxHeight || 1000000);
						I.dirtySize = true;
						break;
					case "middle":
						var z = o - I.height - q;
						if (z > 0) {
							I.top = D + q + (z / 2)
						}
					}
					U += I.width + w.right
				}
				return {
					boxes : H,
					meta : {
						maxHeight : Q,
						nonFlexWidth : L,
						desiredWidth : l,
						minimumWidth : X,
						shortfall : l - a,
						tooNarrow : p
					}
				}
			}
		});
Ext.Container.LAYOUTS.hbox = Ext.layout.HBoxLayout;
Ext.layout.VBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
			align : "left",
			type : "vbox",
			calculateChildBoxes : function (o, b) {
				var E = o.length,
				R = this.padding,
				C = R.top,
				V = R.left,
				x = C + R.bottom,
				O = V + R.right,
				a = b.width - this.scrollOffset,
				c = b.height,
				K = Math.max(0, a - O),
				P = this.pack == "start",
				X = this.pack == "center",
				z = this.pack == "end",
				k = 0,
				u = 0,
				U = 0,
				L = 0,
				m = 0,
				G = [],
				h,
				I,
				N,
				W,
				t,
				g,
				T,
				H,
				S,
				w,
				n,
				d,
				r;
				for (T = 0; T < E; T++) {
					h = o[T];
					N = h.height;
					I = h.width;
					g = !h.hasLayout && typeof h.doLayout == "function";
					if (typeof N != "number") {
						if (h.flex && !N) {
							U += h.flex
						} else {
							if (!N && g) {
								h.doLayout()
							}
							W = h.getSize();
							I = W.width;
							N = W.height
						}
					}
					t = h.margins;
					n = t.top + t.bottom;
					k += n + (N || 0);
					L += n + (h.flex ? h.minHeight || 0 : N);
					m += n + (h.minHeight || N || 0);
					if (typeof I != "number") {
						if (g) {
							h.doLayout()
						}
						I = h.getWidth()
					}
					u = Math.max(u, I + t.left + t.right);
					G.push({
							component : h,
							height : N || undefined,
							width : I || undefined
						})
				}
				var M = L - c,
				l = m > c;
				var q = Math.max(0, (c - k - x));
				if (l) {
					for (T = 0, r = E; T < r; T++) {
						G[T].height = o[T].minHeight || o[T].height || G[T].height
					}
				} else {
					if (M > 0) {
						var J = [];
						for (var D = 0, r = E; D < r; D++) {
							var A = o[D],
							s = A.minHeight || 0;
							if (A.flex) {
								G[D].height = s
							} else {
								J.push({
										minHeight : s,
										available : G[D].height - s,
										index : D
									})
							}
						}
						J.sort(function (Y, i) {
								return Y.available > i.available ? 1 : -1
							});
						for (var T = 0, r = J.length; T < r; T++) {
							var F = J[T].index;
							if (F == undefined) {
								continue
							}
							var A = o[F],
							j = G[F],
							v = j.height,
							s = A.minHeight,
							B = Math.max(s, v - Math.ceil(M / (r - T))),
							e = v - B;
							G[F].height = B;
							M -= e
						}
					} else {
						var Q = q,
						p = U;
						for (T = 0; T < E; T++) {
							h = o[T];
							H = G[T];
							t = h.margins;
							w = t.left + t.right;
							if (P && h.flex && !h.height) {
								S = Math.ceil((h.flex / p) * Q);
								Q -= S;
								p -= h.flex;
								H.height = S;
								H.dirtySize = true
							}
						}
					}
				}
				if (X) {
					C += q / 2
				} else {
					if (z) {
						C += q
					}
				}
				for (T = 0; T < E; T++) {
					h = o[T];
					H = G[T];
					t = h.margins;
					C += t.top;
					w = t.left + t.right;
					H.left = V + t.left;
					H.top = C;
					switch (this.align) {
					case "stretch":
						d = K - w;
						H.width = d.constrain(h.minWidth || 0, h.maxWidth || 1000000);
						H.dirtySize = true;
						break;
					case "stretchmax":
						d = u - w;
						H.width = d.constrain(h.minWidth || 0, h.maxWidth || 1000000);
						H.dirtySize = true;
						break;
					case "center":
						var y = K - H.width - w;
						if (y > 0) {
							H.left = V + w + (y / 2)
						}
					}
					C += H.height + t.bottom
				}
				return {
					boxes : G,
					meta : {
						maxWidth : u,
						nonFlexHeight : k,
						desiredHeight : L,
						minimumHeight : m,
						shortfall : L - c,
						tooNarrow : l
					}
				}
			}
		});
Ext.Container.LAYOUTS.vbox = Ext.layout.VBoxLayout;
Ext.layout.ToolbarLayout = Ext.extend(Ext.layout.ContainerLayout, {
			monitorResize : true,
			type : "toolbar",
			triggerWidth : 18,
			noItemsMenuText : '<div class="x-toolbar-no-items">(None)</div>',
			lastOverflow : false,
			tableHTML : ['<table cellspacing="0" class="x-toolbar-ct">', "<tbody>", "<tr>", '<td class="x-toolbar-left" align="{0}">', '<table cellspacing="0">', "<tbody>", '<tr class="x-toolbar-left-row"></tr>', "</tbody>", "</table>", "</td>", '<td class="x-toolbar-right" align="right">', '<table cellspacing="0" class="x-toolbar-right-ct">', "<tbody>", "<tr>", "<td>", '<table cellspacing="0">', "<tbody>", '<tr class="x-toolbar-right-row"></tr>', "</tbody>", "</table>", "</td>", "<td>", '<table cellspacing="0">', "<tbody>", '<tr class="x-toolbar-extras-row"></tr>', "</tbody>", "</table>", "</td>", "</tr>", "</tbody>", "</table>", "</td>", "</tr>", "</tbody>", "</table>"].join(""),
			onLayout : function (e, j) {
				if (!this.leftTr) {
					var h = e.buttonAlign == "center" ? "center" : "left";
					j.addClass("x-toolbar-layout-ct");
					j.insertHtml("beforeEnd", String.format(this.tableHTML, h));
					this.leftTr = j.child("tr.x-toolbar-left-row", true);
					this.rightTr = j.child("tr.x-toolbar-right-row", true);
					this.extrasTr = j.child("tr.x-toolbar-extras-row", true);
					if (this.hiddenItem == undefined) {
						this.hiddenItems = []
					}
				}
				var k = e.buttonAlign == "right" ? this.rightTr : this.leftTr,
				l = e.items.items,
				d = 0;
				for (var b = 0, g = l.length, m; b < g; b++, d++) {
					m = l[b];
					if (m.isFill) {
						k = this.rightTr;
						d = -1
					} else {
						if (!m.rendered) {
							m.render(this.insertCell(m, k, d));
							this.configureItem(m)
						} else {
							if (!m.xtbHidden && !this.isValidParent(m, k.childNodes[d])) {
								var a = this.insertCell(m, k, d);
								a.appendChild(m.getPositionEl().dom);
								m.container = Ext.get(a)
							}
						}
					}
				}
				this.cleanup(this.leftTr);
				this.cleanup(this.rightTr);
				this.cleanup(this.extrasTr);
				this.fitToSize(j)
			},
			cleanup : function (b) {
				var e = b.childNodes,
				a,
				d;
				for (a = e.length - 1; a >= 0 && (d = e[a]); a--) {
					if (!d.firstChild) {
						b.removeChild(d)
					}
				}
			},
			insertCell : function (e, b, a) {
				var d = document.createElement("td");
				d.className = "x-toolbar-cell";
				b.insertBefore(d, b.childNodes[a] || null);
				return d
			},
			hideItem : function (a) {
				this.hiddenItems.push(a);
				a.xtbHidden = true;
				a.xtbWidth = a.getPositionEl().dom.parentNode.offsetWidth;
				a.hide()
			},
			unhideItem : function (a) {
				a.show();
				a.xtbHidden = false;
				this.hiddenItems.remove(a)
			},
			getItemWidth : function (a) {
				return a.hidden ? (a.xtbWidth || 0) : a.getPositionEl().dom.parentNode.offsetWidth
			},
			fitToSize : function (k) {
				if (this.container.enableOverflow === false) {
					return
				}
				var b = k.dom.clientWidth,
				j = k.dom.firstChild.offsetWidth,
				m = b - this.triggerWidth,
				a = this.lastWidth || 0,
				c = this.hiddenItems,
				e = c.length != 0,
				n = b >= a;
				this.lastWidth = b;
				if (j > b || (e && n)) {
					var l = this.container.items.items,
					h = l.length,
					d = 0,
					o;
					for (var g = 0; g < h; g++) {
						o = l[g];
						if (!o.isFill) {
							d += this.getItemWidth(o);
							if (d > m) {
								if (!(o.hidden || o.xtbHidden)) {
									this.hideItem(o)
								}
							} else {
								if (o.xtbHidden) {
									this.unhideItem(o)
								}
							}
						}
					}
				}
				e = c.length != 0;
				if (e) {
					this.initMore();
					if (!this.lastOverflow) {
						this.container.fireEvent("overflowchange", this.container, true);
						this.lastOverflow = true
					}
				} else {
					if (this.more) {
						this.clearMenu();
						this.more.destroy();
						delete this.more;
						if (this.lastOverflow) {
							this.container.fireEvent("overflowchange", this.container, false);
							this.lastOverflow = false
						}
					}
				}
			},
			createMenuConfig : function (c, a) {
				var b = Ext.apply({}, c.initialConfig),
				d = c.toggleGroup;
				Ext.copyTo(b, c, ["iconCls", "icon", "itemId", "disabled", "handler", "scope", "menu"]);
				Ext.apply(b, {
						text : c.overflowText || c.text,
						hideOnClick : a
					});
				if (d || c.enableToggle) {
					Ext.apply(b, {
							group : d,
							checked : c.pressed,
							listeners : {
								checkchange : function (g, e) {
									c.toggle(e)
								}
							}
						})
				}
				delete b.ownerCt;
				delete b.xtype;
				delete b.id;
				return b
			},
			addComponentToMenu : function (b, a) {
				if (a instanceof Ext.Toolbar.Separator) {
					b.add("-")
				} else {
					if (Ext.isFunction(a.isXType)) {
						if (a.isXType("splitbutton")) {
							b.add(this.createMenuConfig(a, true))
						} else {
							if (a.isXType("button")) {
								b.add(this.createMenuConfig(a, !a.menu))
							} else {
								if (a.isXType("buttongroup")) {
									a.items.each(function (c) {
											this.addComponentToMenu(b, c)
										}, this)
								}
							}
						}
					}
				}
			},
			clearMenu : function () {
				var a = this.moreMenu;
				if (a && a.items) {
					a.items.each(function (b) {
							delete b.menu
						})
				}
			},
			beforeMoreShow : function (h) {
				var b = this.container.items.items,
				a = b.length,
				g,
				e;
				var c = function (j, i) {
					return j.isXType("buttongroup") && !(i instanceof Ext.Toolbar.Separator)
				};
				this.clearMenu();
				h.removeAll();
				for (var d = 0; d < a; d++) {
					g = b[d];
					if (g.xtbHidden) {
						if (e && (c(g, e) || c(e, g))) {
							h.add("-")
						}
						this.addComponentToMenu(h, g);
						e = g
					}
				}
				if (h.items.length < 1) {
					h.add(this.noItemsMenuText)
				}
			},
			initMore : function () {
				if (!this.more) {
					this.moreMenu = new Ext.menu.Menu({
								ownerCt : this.container,
								listeners : {
									beforeshow : this.beforeMoreShow,
									scope : this
								}
							});
					this.more = new Ext.Button({
								iconCls : "x-toolbar-more-icon",
								cls : "x-toolbar-more",
								menu : this.moreMenu,
								ownerCt : this.container
							});
					var a = this.insertCell(this.more, this.extrasTr, 100);
					this.more.render(a)
				}
			},
			destroy : function () {
				Ext.destroy(this.more, this.moreMenu);
				delete this.leftTr;
				delete this.rightTr;
				delete this.extrasTr;
				Ext.layout.ToolbarLayout.superclass.destroy.call(this)
			}
		});
Ext.Container.LAYOUTS.toolbar = Ext.layout.ToolbarLayout;
Ext.layout.MenuLayout = Ext.extend(Ext.layout.ContainerLayout, {
			monitorResize : true,
			type : "menu",
			setContainer : function (a) {
				this.monitorResize = !a.floating;
				a.on("autosize", this.doAutoSize, this);
				Ext.layout.MenuLayout.superclass.setContainer.call(this, a)
			},
			renderItem : function (g, b, e) {
				if (!this.itemTpl) {
					this.itemTpl = Ext.layout.MenuLayout.prototype.itemTpl = new Ext.XTemplate('<li id="{itemId}" class="{itemCls}">', '<tpl if="needsIcon">', '<img alt="{altText}" src="{icon}" class="{iconCls}"/>', "</tpl>", "</li>")
				}
				if (g && !g.rendered) {
					if (Ext.isNumber(b)) {
						b = e.dom.childNodes[b]
					}
					var d = this.getItemArgs(g);
					g.render(g.positionEl = b ? this.itemTpl.insertBefore(b, d, true) : this.itemTpl.append(e, d, true));
					g.positionEl.menuItemId = g.getItemId();
					if (!d.isMenuItem && d.needsIcon) {
						g.positionEl.addClass("x-menu-list-item-indent")
					}
					this.configureItem(g)
				} else {
					if (g && !this.isValidParent(g, e)) {
						if (Ext.isNumber(b)) {
							b = e.dom.childNodes[b]
						}
						e.dom.insertBefore(g.getActionEl().dom, b || null)
					}
				}
			},
			getItemArgs : function (d) {
				var a = d instanceof Ext.menu.Item,
				b = !(a || d instanceof Ext.menu.Separator);
				return {
					isMenuItem : a,
					needsIcon : b && (d.icon || d.iconCls),
					icon : d.icon || Ext.BLANK_IMAGE_URL,
					iconCls : "x-menu-item-icon " + (d.iconCls || ""),
					itemId : "x-menu-el-" + d.id,
					itemCls : "x-menu-list-item ",
					altText : d.altText || ""
				}
			},
			isValidParent : function (b, a) {
				return b.el.up("li.x-menu-list-item", 5).dom.parentNode === (a.dom || a)
			},
			onLayout : function (a, b) {
				Ext.layout.MenuLayout.superclass.onLayout.call(this, a, b);
				this.doAutoSize()
			},
			doAutoSize : function () {
				var c = this.container,
				a = c.width;
				if (c.floating) {
					if (a) {
						c.setWidth(a)
					} else {
						if (Ext.isIE) {
							c.setWidth(Ext.isStrict && (Ext.isIE7 || Ext.isIE8 || Ext.isIE9) ? "auto" : c.minWidth);
							var d = c.getEl(),
							b = d.dom.offsetWidth;
							c.setWidth(c.getLayoutTarget().getWidth() + d.getFrameWidth("lr"))
						}
					}
				}
			}
		});
Ext.Container.LAYOUTS.menu = Ext.layout.MenuLayout;
Ext.Viewport = Ext.extend(Ext.Container, {
			initComponent : function () {
				Ext.Viewport.superclass.initComponent.call(this);
				document.getElementsByTagName("html")[0].className += " x-viewport";
				this.el = Ext.getBody();
				this.el.setHeight = Ext.emptyFn;
				this.el.setWidth = Ext.emptyFn;
				this.el.setSize = Ext.emptyFn;
				this.el.dom.scroll = "no";
				this.allowDomMove = false;
				this.autoWidth = true;
				this.autoHeight = true;
				Ext.EventManager.onWindowResize(this.fireResize, this);
				this.renderTo = this.el
			},
			fireResize : function (a, b) {
				this.fireEvent("resize", this, a, b, a, b)
			}
		});
Ext.reg("viewport", Ext.Viewport);
Ext.Panel = Ext.extend(Ext.Container, {
			baseCls : "x-panel",
			collapsedCls : "x-panel-collapsed",
			maskDisabled : true,
			animCollapse : Ext.enableFx,
			headerAsText : true,
			buttonAlign : "right",
			collapsed : false,
			collapseFirst : true,
			minButtonWidth : 75,
			elements : "body",
			preventBodyReset : false,
			padding : undefined,
			resizeEvent : "bodyresize",
			toolTarget : "header",
			collapseEl : "bwrap",
			slideAnchor : "t",
			disabledClass : "",
			deferHeight : true,
			expandDefaults : {
				duration : 0.25
			},
			collapseDefaults : {
				duration : 0.25
			},
			initComponent : function () {
				Ext.Panel.superclass.initComponent.call(this);
				this.addEvents("bodyresize", "titlechange", "iconchange", "collapse", "expand", "beforecollapse", "beforeexpand", "beforeclose", "close", "activate", "deactivate");
				if (this.unstyled) {
					this.baseCls = "x-plain"
				}
				this.toolbars = [];
				if (this.tbar) {
					this.elements += ",tbar";
					this.topToolbar = this.createToolbar(this.tbar);
					this.tbar = null
				}
				if (this.bbar) {
					this.elements += ",bbar";
					this.bottomToolbar = this.createToolbar(this.bbar);
					this.bbar = null
				}
				if (this.header === true) {
					this.elements += ",header";
					this.header = null
				} else {
					if (this.headerCfg || (this.title && this.header !== false)) {
						this.elements += ",header"
					}
				}
				if (this.footerCfg || this.footer === true) {
					this.elements += ",footer";
					this.footer = null
				}
				if (this.buttons) {
					this.fbar = this.buttons;
					this.buttons = null
				}
				if (this.fbar) {
					this.createFbar(this.fbar)
				}
				if (this.autoLoad) {
					this.on("render", this.doAutoLoad, this, {
							delay : 10
						})
				}
			},
			createFbar : function (b) {
				var a = this.minButtonWidth;
				this.elements += ",footer";
				this.fbar = this.createToolbar(b, {
							buttonAlign : this.buttonAlign,
							toolbarCls : "x-panel-fbar",
							enableOverflow : false,
							defaults : function (d) {
								return {
									minWidth : d.minWidth || a
								}
							}
						});
				this.fbar.items.each(function (d) {
						d.minWidth = d.minWidth || this.minButtonWidth
					}, this);
				this.buttons = this.fbar.items.items
			},
			createToolbar : function (b, c) {
				var a;
				if (Ext.isArray(b)) {
					b = {
						items : b
					}
				}
				a = b.events ? Ext.apply(b, c) : this.createComponent(Ext.apply({}, b, c), "toolbar");
				this.toolbars.push(a);
				return a
			},
			createElement : function (a, c) {
				if (this[a]) {
					c.appendChild(this[a].dom);
					return
				}
				if (a === "bwrap" || this.elements.indexOf(a) != -1) {
					if (this[a + "Cfg"]) {
						this[a] = Ext.fly(c).createChild(this[a + "Cfg"])
					} else {
						var b = document.createElement("div");
						b.className = this[a + "Cls"];
						this[a] = Ext.get(c.appendChild(b))
					}
					if (this[a + "CssClass"]) {
						this[a].addClass(this[a + "CssClass"])
					}
					if (this[a + "Style"]) {
						this[a].applyStyles(this[a + "Style"])
					}
				}
			},
			onRender : function (g, e) {
				Ext.Panel.superclass.onRender.call(this, g, e);
				this.createClasses();
				var a = this.el,
				h = a.dom,
				k,
				i;
				if (this.collapsible && !this.hideCollapseTool) {
					this.tools = this.tools ? this.tools.slice(0) : [];
					this.tools[this.collapseFirst ? "unshift" : "push"]({
							id : "toggle",
							handler : this.toggleCollapse,
							scope : this
						})
				}
				if (this.tools) {
					i = this.tools;
					this.elements += (this.header !== false) ? ",header" : ""
				}
				this.tools = {};
				a.addClass(this.baseCls);
				if (h.firstChild) {
					this.header = a.down("." + this.headerCls);
					this.bwrap = a.down("." + this.bwrapCls);
					var j = this.bwrap ? this.bwrap : a;
					this.tbar = j.down("." + this.tbarCls);
					this.body = j.down("." + this.bodyCls);
					this.bbar = j.down("." + this.bbarCls);
					this.footer = j.down("." + this.footerCls);
					this.fromMarkup = true
				}
				if (this.preventBodyReset === true) {
					a.addClass("x-panel-reset")
				}
				if (this.cls) {
					a.addClass(this.cls)
				}
				if (this.buttons) {
					this.elements += ",footer"
				}
				if (this.frame) {
					a.insertHtml("afterBegin", String.format(Ext.Element.boxMarkup, this.baseCls));
					this.createElement("header", h.firstChild.firstChild.firstChild);
					this.createElement("bwrap", h);
					k = this.bwrap.dom;
					var c = h.childNodes[1],
					b = h.childNodes[2];
					k.appendChild(c);
					k.appendChild(b);
					var l = k.firstChild.firstChild.firstChild;
					this.createElement("tbar", l);
					this.createElement("body", l);
					this.createElement("bbar", l);
					this.createElement("footer", k.lastChild.firstChild.firstChild);
					if (!this.footer) {
						this.bwrap.dom.lastChild.className += " x-panel-nofooter"
					}
					this.ft = Ext.get(this.bwrap.dom.lastChild);
					this.mc = Ext.get(l)
				} else {
					this.createElement("header", h);
					this.createElement("bwrap", h);
					k = this.bwrap.dom;
					this.createElement("tbar", k);
					this.createElement("body", k);
					this.createElement("bbar", k);
					this.createElement("footer", k);
					if (!this.header) {
						this.body.addClass(this.bodyCls + "-noheader");
						if (this.tbar) {
							this.tbar.addClass(this.tbarCls + "-noheader")
						}
					}
				}
				if (Ext.isDefined(this.padding)) {
					this.body.setStyle("padding", this.body.addUnits(this.padding))
				}
				if (this.border === false) {
					this.el.addClass(this.baseCls + "-noborder");
					this.body.addClass(this.bodyCls + "-noborder");
					if (this.header) {
						this.header.addClass(this.headerCls + "-noborder")
					}
					if (this.footer) {
						this.footer.addClass(this.footerCls + "-noborder")
					}
					if (this.tbar) {
						this.tbar.addClass(this.tbarCls + "-noborder")
					}
					if (this.bbar) {
						this.bbar.addClass(this.bbarCls + "-noborder")
					}
				}
				if (this.bodyBorder === false) {
					this.body.addClass(this.bodyCls + "-noborder")
				}
				this.bwrap.enableDisplayMode("block");
				if (this.header) {
					this.header.unselectable();
					if (this.headerAsText) {
						this.header.dom.innerHTML = '<span class="' + this.headerTextCls + '">' + this.header.dom.innerHTML + "</span>";
						if (this.iconCls) {
							this.setIconClass(this.iconCls)
						}
					}
				}
				if (this.floating) {
					this.makeFloating(this.floating)
				}
				if (this.collapsible && this.titleCollapse && this.header) {
					this.mon(this.header, "click", this.toggleCollapse, this);
					this.header.setStyle("cursor", "pointer")
				}
				if (i) {
					this.addTool.apply(this, i)
				}
				if (this.fbar) {
					this.footer.addClass("x-panel-btns");
					this.fbar.ownerCt = this;
					this.fbar.render(this.footer);
					this.footer.createChild({
							cls : "x-clear"
						})
				}
				if (this.tbar && this.topToolbar) {
					this.topToolbar.ownerCt = this;
					this.topToolbar.render(this.tbar)
				}
				if (this.bbar && this.bottomToolbar) {
					this.bottomToolbar.ownerCt = this;
					this.bottomToolbar.render(this.bbar)
				}
			},
			setIconClass : function (b) {
				var a = this.iconCls;
				this.iconCls = b;
				if (this.rendered && this.header) {
					if (this.frame) {
						this.header.addClass("x-panel-icon");
						this.header.replaceClass(a, this.iconCls)
					} else {
						var e = this.header,
						c = e.child("img.x-panel-inline-icon");
						if (c) {
							Ext.fly(c).replaceClass(a, this.iconCls)
						} else {
							var d = e.child("span." + this.headerTextCls);
							if (d) {
								Ext.DomHelper.insertBefore(d.dom, {
										tag : "img",
										alt : "",
										src : Ext.BLANK_IMAGE_URL,
										cls : "x-panel-inline-icon " + this.iconCls
									})
							}
						}
					}
				}
				this.fireEvent("iconchange", this, b, a)
			},
			makeFloating : function (a) {
				this.floating = true;
				this.el = new Ext.Layer(Ext.apply({}, a, {
								shadow : Ext.isDefined(this.shadow) ? this.shadow : "sides",
								shadowOffset : this.shadowOffset,
								constrain : false,
								shim : this.shim === false ? false : undefined
							}), this.el)
			},
			getTopToolbar : function () {
				return this.topToolbar
			},
			getBottomToolbar : function () {
				return this.bottomToolbar
			},
			getFooterToolbar : function () {
				return this.fbar
			},
			addButton : function (a, c, b) {
				if (!this.fbar) {
					this.createFbar([])
				}
				if (c) {
					if (Ext.isString(a)) {
						a = {
							text : a
						}
					}
					a = Ext.apply({
								handler : c,
								scope : b
							}, a)
				}
				return this.fbar.add(a)
			},
			addTool : function () {
				if (!this.rendered) {
					if (!this.tools) {
						this.tools = []
					}
					Ext.each(arguments, function (a) {
							this.tools.push(a)
						}, this);
					return
				}
				if (!this[this.toolTarget]) {
					return
				}
				if (!this.toolTemplate) {
					var h = new Ext.Template('<div class="x-tool x-tool-{id}">&#160;</div>');
					h.disableFormats = true;
					h.compile();
					Ext.Panel.prototype.toolTemplate = h
				}
				for (var g = 0, d = arguments, c = d.length; g < c; g++) {
					var b = d[g];
					if (!this.tools[b.id]) {
						var j = "x-tool-" + b.id + "-over";
						var e = this.toolTemplate.insertFirst(this[this.toolTarget], b, true);
						this.tools[b.id] = e;
						e.enableDisplayMode("block");
						this.mon(e, "click", this.createToolHandler(e, b, j, this));
						if (b.on) {
							this.mon(e, b.on)
						}
						if (b.hidden) {
							e.hide()
						}
						if (b.qtip) {
							if (Ext.isObject(b.qtip)) {
								Ext.QuickTips.register(Ext.apply({
											target : e.id
										}, b.qtip))
							} else {
								e.dom.qtip = b.qtip
							}
						}
						e.addClassOnOver(j)
					}
				}
			},
			onLayout : function (b, a) {
				Ext.Panel.superclass.onLayout.apply(this, arguments);
				if (this.hasLayout && this.toolbars.length > 0) {
					Ext.each(this.toolbars, function (c) {
							c.doLayout(undefined, a)
						});
					this.syncHeight()
				}
			},
			syncHeight : function () {
				var b = this.toolbarHeight,
				c = this.body,
				a = this.lastSize.height,
				d;
				if (this.autoHeight || !Ext.isDefined(a) || a == "auto") {
					return
				}
				if (b != this.getToolbarHeight()) {
					b = Math.max(0, a - this.getFrameHeight());
					c.setHeight(b);
					d = c.getSize();
					this.toolbarHeight = this.getToolbarHeight();
					this.onBodyResize(d.width, d.height)
				}
			},
			onShow : function () {
				if (this.floating) {
					return this.el.show()
				}
				Ext.Panel.superclass.onShow.call(this)
			},
			onHide : function () {
				if (this.floating) {
					return this.el.hide()
				}
				Ext.Panel.superclass.onHide.call(this)
			},
			createToolHandler : function (c, a, d, b) {
				return function (g) {
					c.removeClass(d);
					if (a.stopEvent !== false) {
						g.stopEvent()
					}
					if (a.handler) {
						a.handler.call(a.scope || c, g, c, b, a)
					}
				}
			},
			afterRender : function () {
				if (this.floating && !this.hidden) {
					this.el.show()
				}
				if (this.title) {
					this.setTitle(this.title)
				}
				Ext.Panel.superclass.afterRender.call(this);
				if (this.collapsed) {
					this.collapsed = false;
					this.collapse(false)
				}
				this.initEvents()
			},
			getKeyMap : function () {
				if (!this.keyMap) {
					this.keyMap = new Ext.KeyMap(this.el, this.keys)
				}
				return this.keyMap
			},
			initEvents : function () {
				if (this.keys) {
					this.getKeyMap()
				}
				if (this.draggable) {
					this.initDraggable()
				}
				if (this.toolbars.length > 0) {
					Ext.each(this.toolbars, function (a) {
							a.doLayout();
							a.on({
									scope : this,
									afterlayout : this.syncHeight,
									remove : this.syncHeight
								})
						}, this);
					this.syncHeight()
				}
			},
			initDraggable : function () {
				this.dd = new Ext.Panel.DD(this, Ext.isBoolean(this.draggable) ? null : this.draggable)
			},
			beforeEffect : function (a) {
				if (this.floating) {
					this.el.beforeAction()
				}
				if (a !== false) {
					this.el.addClass("x-panel-animated")
				}
			},
			afterEffect : function (a) {
				this.syncShadow();
				this.el.removeClass("x-panel-animated")
			},
			createEffect : function (c, b, d) {
				var e = {
					scope : d,
					block : true
				};
				if (c === true) {
					e.callback = b;
					return e
				} else {
					if (!c.callback) {
						e.callback = b
					} else {
						e.callback = function () {
							b.call(d);
							Ext.callback(c.callback, c.scope)
						}
					}
				}
				return Ext.applyIf(e, c)
			},
			collapse : function (b) {
				if (this.collapsed || this.el.hasFxBlock() || this.fireEvent("beforecollapse", this, b) === false) {
					return
				}
				var a = b === true || (b !== false && this.animCollapse);
				this.beforeEffect(a);
				this.onCollapse(a, b);
				return this
			},
			onCollapse : function (a, b) {
				if (a) {
					this[this.collapseEl].slideOut(this.slideAnchor, Ext.apply(this.createEffect(b || true, this.afterCollapse, this), this.collapseDefaults))
				} else {
					this[this.collapseEl].hide(this.hideMode);
					this.afterCollapse(false)
				}
			},
			afterCollapse : function (a) {
				this.collapsed = true;
				this.el.addClass(this.collapsedCls);
				if (a !== false) {
					this[this.collapseEl].hide(this.hideMode)
				}
				this.afterEffect(a);
				this.cascade(function (b) {
						if (b.lastSize) {
							b.lastSize = {
								width : undefined,
								height : undefined
							}
						}
					});
				this.fireEvent("collapse", this)
			},
			expand : function (b) {
				if (!this.collapsed || this.el.hasFxBlock() || this.fireEvent("beforeexpand", this, b) === false) {
					return
				}
				var a = b === true || (b !== false && this.animCollapse);
				this.el.removeClass(this.collapsedCls);
				this.beforeEffect(a);
				this.onExpand(a, b);
				return this
			},
			onExpand : function (a, b) {
				if (a) {
					this[this.collapseEl].slideIn(this.slideAnchor, Ext.apply(this.createEffect(b || true, this.afterExpand, this), this.expandDefaults))
				} else {
					this[this.collapseEl].show(this.hideMode);
					this.afterExpand(false)
				}
			},
			afterExpand : function (a) {
				this.collapsed = false;
				if (a !== false) {
					this[this.collapseEl].show(this.hideMode)
				}
				this.afterEffect(a);
				if (this.deferLayout) {
					delete this.deferLayout;
					this.doLayout(true)
				}
				this.fireEvent("expand", this)
			},
			toggleCollapse : function (a) {
				this[this.collapsed ? "expand" : "collapse"](a);
				return this
			},
			onDisable : function () {
				if (this.rendered && this.maskDisabled) {
					this.el.mask()
				}
				Ext.Panel.superclass.onDisable.call(this)
			},
			onEnable : function () {
				if (this.rendered && this.maskDisabled) {
					this.el.unmask()
				}
				Ext.Panel.superclass.onEnable.call(this)
			},
			onResize : function (g, d, c, e) {
				var a = g,
				b = d;
				if (Ext.isDefined(a) || Ext.isDefined(b)) {
					if (!this.collapsed) {
						if (Ext.isNumber(a)) {
							this.body.setWidth(a = this.adjustBodyWidth(a - this.getFrameWidth()))
						} else {
							if (a == "auto") {
								a = this.body.setWidth("auto").dom.offsetWidth
							} else {
								a = this.body.dom.offsetWidth
							}
						}
						if (this.tbar) {
							this.tbar.setWidth(a);
							if (this.topToolbar) {
								this.topToolbar.setSize(a)
							}
						}
						if (this.bbar) {
							this.bbar.setWidth(a);
							if (this.bottomToolbar) {
								this.bottomToolbar.setSize(a);
								if (Ext.isIE) {
									this.bbar.setStyle("position", "static");
									this.bbar.setStyle("position", "")
								}
							}
						}
						if (this.footer) {
							this.footer.setWidth(a);
							if (this.fbar) {
								this.fbar.setSize(Ext.isIE ? (a - this.footer.getFrameWidth("lr")) : "auto")
							}
						}
						if (Ext.isNumber(b)) {
							b = Math.max(0, b - this.getFrameHeight());
							this.body.setHeight(b)
						} else {
							if (b == "auto") {
								this.body.setHeight(b)
							}
						}
						if (this.disabled && this.el._mask) {
							this.el._mask.setSize(this.el.dom.clientWidth, this.el.getHeight())
						}
					} else {
						this.queuedBodySize = {
							width : a,
							height : b
						};
						if (!this.queuedExpand && this.allowQueuedExpand !== false) {
							this.queuedExpand = true;
							this.on("expand", function () {
									delete this.queuedExpand;
									this.onResize(this.queuedBodySize.width, this.queuedBodySize.height)
								}, this, {
									single : true
								})
						}
					}
					this.onBodyResize(a, b)
				}
				this.syncShadow();
				Ext.Panel.superclass.onResize.call(this, g, d, c, e)
			},
			onBodyResize : function (a, b) {
				this.fireEvent("bodyresize", this, a, b)
			},
			getToolbarHeight : function () {
				var a = 0;
				if (this.rendered) {
					Ext.each(this.toolbars, function (b) {
							a += b.getHeight()
						}, this)
				}
				return a
			},
			adjustBodyHeight : function (a) {
				return a
			},
			adjustBodyWidth : function (a) {
				return a
			},
			onPosition : function () {
				this.syncShadow()
			},
			getFrameWidth : function () {
				var b = this.el.getFrameWidth("lr") + this.bwrap.getFrameWidth("lr");
				if (this.frame) {
					var a = this.bwrap.dom.firstChild;
					b += (Ext.fly(a).getFrameWidth("l") + Ext.fly(a.firstChild).getFrameWidth("r"));
					b += this.mc.getFrameWidth("lr")
				}
				return b
			},
			getFrameHeight : function () {
				var a = this.el.getFrameWidth("tb") + this.bwrap.getFrameWidth("tb");
				a += (this.tbar ? this.tbar.getHeight() : 0) + (this.bbar ? this.bbar.getHeight() : 0);
				if (this.frame) {
					a += this.el.dom.firstChild.offsetHeight + this.ft.dom.offsetHeight + this.mc.getFrameWidth("tb")
				} else {
					a += (this.header ? this.header.getHeight() : 0) + (this.footer ? this.footer.getHeight() : 0)
				}
				return a
			},
			getInnerWidth : function () {
				return this.getSize().width - this.getFrameWidth()
			},
			getInnerHeight : function () {
				return this.body.getHeight()
			},
			syncShadow : function () {
				if (this.floating) {
					this.el.sync(true)
				}
			},
			getLayoutTarget : function () {
				return this.body
			},
			getContentTarget : function () {
				return this.body
			},
			setTitle : function (b, a) {
				this.title = b;
				if (this.header && this.headerAsText) {
					this.header.child("span").update(b)
				}
				if (a) {
					this.setIconClass(a)
				}
				this.fireEvent("titlechange", this, b);
				return this
			},
			getUpdater : function () {
				return this.body.getUpdater()
			},
			load : function () {
				var a = this.body.getUpdater();
				a.update.apply(a, arguments);
				return this
			},
			beforeDestroy : function () {
				Ext.Panel.superclass.beforeDestroy.call(this);
				if (this.header) {
					this.header.removeAllListeners()
				}
				if (this.tools) {
					for (var a in this.tools) {
						Ext.destroy(this.tools[a])
					}
				}
				if (this.toolbars.length > 0) {
					Ext.each(this.toolbars, function (b) {
							b.un("afterlayout", this.syncHeight, this);
							b.un("remove", this.syncHeight, this)
						}, this)
				}
				if (Ext.isArray(this.buttons)) {
					while (this.buttons.length) {
						Ext.destroy(this.buttons[0])
					}
				}
				if (this.rendered) {
					Ext.destroy(this.ft, this.header, this.footer, this.tbar, this.bbar, this.body, this.mc, this.bwrap, this.dd);
					if (this.fbar) {
						Ext.destroy(this.fbar, this.fbar.el)
					}
				}
				Ext.destroy(this.toolbars)
			},
			createClasses : function () {
				this.headerCls = this.baseCls + "-header";
				this.headerTextCls = this.baseCls + "-header-text";
				this.bwrapCls = this.baseCls + "-bwrap";
				this.tbarCls = this.baseCls + "-tbar";
				this.bodyCls = this.baseCls + "-body";
				this.bbarCls = this.baseCls + "-bbar";
				this.footerCls = this.baseCls + "-footer"
			},
			createGhost : function (a, e, b) {
				var d = document.createElement("div");
				d.className = "x-panel-ghost " + (a ? a : "");
				if (this.header) {
					d.appendChild(this.el.dom.firstChild.cloneNode(true))
				}
				Ext.fly(d.appendChild(document.createElement("ul"))).setHeight(this.bwrap.getHeight());
				d.style.width = this.el.dom.offsetWidth + "px";
				if (!b) {
					this.container.dom.appendChild(d)
				} else {
					Ext.getDom(b).appendChild(d)
				}
				if (e !== false && this.el.useShim !== false) {
					var c = new Ext.Layer({
								shadow : false,
								useDisplay : true,
								constrain : false
							}, d);
					c.show();
					return c
				} else {
					return new Ext.Element(d)
				}
			},
			doAutoLoad : function () {
				var a = this.body.getUpdater();
				if (this.renderer) {
					a.setRenderer(this.renderer)
				}
				a.update(Ext.isObject(this.autoLoad) ? this.autoLoad : {
						url : this.autoLoad
					})
			},
			getTool : function (a) {
				return this.tools[a]
			}
		});
Ext.reg("panel", Ext.Panel);
Ext.Editor = function (b, a) {
	if (b.field) {
		this.field = Ext.create(b.field, "textfield");
		a = Ext.apply({}, b);
		delete a.field
	} else {
		this.field = b
	}
	Ext.Editor.superclass.constructor.call(this, a)
};
Ext.extend(Ext.Editor, Ext.Component, {
		allowBlur : true,
		value : "",
		alignment : "c-c?",
		offsets : [0, 0],
		shadow : "frame",
		constrain : false,
		swallowKeys : true,
		completeOnEnter : true,
		cancelOnEsc : true,
		updateEl : false,
		initComponent : function () {
			Ext.Editor.superclass.initComponent.call(this);
			this.addEvents("beforestartedit", "startedit", "beforecomplete", "complete", "canceledit", "specialkey")
		},
		onRender : function (b, a) {
			this.el = new Ext.Layer({
						shadow : this.shadow,
						cls : "x-editor",
						parentEl : b,
						shim : this.shim,
						shadowOffset : this.shadowOffset || 4,
						id : this.id,
						constrain : this.constrain
					});
			if (this.zIndex) {
				this.el.setZIndex(this.zIndex)
			}
			this.el.setStyle("overflow", Ext.isGecko ? "auto" : "hidden");
			if (this.field.msgTarget != "title") {
				this.field.msgTarget = "qtip"
			}
			this.field.inEditor = true;
			this.mon(this.field, {
					scope : this,
					blur : this.onBlur,
					specialkey : this.onSpecialKey
				});
			if (this.field.grow) {
				this.mon(this.field, "autosize", this.el.sync, this.el, {
						delay : 1
					})
			}
			this.field.render(this.el).show();
			this.field.getEl().dom.name = "";
			if (this.swallowKeys) {
				this.field.el.swallowEvent(["keypress", "keydown"])
			}
		},
		onSpecialKey : function (g, d) {
			var b = d.getKey(),
			a = this.completeOnEnter && b == d.ENTER,
			c = this.cancelOnEsc && b == d.ESC;
			if (a || c) {
				d.stopEvent();
				if (a) {
					this.completeEdit()
				} else {
					this.cancelEdit()
				}
				if (g.triggerBlur) {
					g.triggerBlur()
				}
			}
			this.fireEvent("specialkey", g, d)
		},
		startEdit : function (b, c) {
			if (this.editing) {
				this.completeEdit()
			}
			this.boundEl = Ext.get(b);
			var a = c !== undefined ? c : this.boundEl.dom.innerHTML;
			if (!this.rendered) {
				this.render(this.parentEl || document.body)
			}
			if (this.fireEvent("beforestartedit", this, this.boundEl, a) !== false) {
				this.startValue = a;
				this.field.reset();
				this.field.setValue(a);
				this.realign(true);
				this.editing = true;
				this.show()
			}
		},
		doAutoSize : function () {
			if (this.autoSize) {
				var b = this.boundEl.getSize(),
				a = this.field.getSize();
				switch (this.autoSize) {
				case "width":
					this.setSize(b.width, a.height);
					break;
				case "height":
					this.setSize(a.width, b.height);
					break;
				case "none":
					this.setSize(a.width, a.height);
					break;
				default:
					this.setSize(b.width, b.height)
				}
			}
		},
		setSize : function (a, b) {
			delete this.field.lastSize;
			this.field.setSize(a, b);
			if (this.el) {
				if (Ext.isGecko2 || Ext.isOpera || (Ext.isIE7 && Ext.isStrict)) {
					this.el.setSize(a, b)
				}
				this.el.sync()
			}
		},
		realign : function (a) {
			if (a === true) {
				this.doAutoSize()
			}
			this.el.alignTo(this.boundEl, this.alignment, this.offsets)
		},
		completeEdit : function (a) {
			if (!this.editing) {
				return
			}
			if (this.field.assertValue) {
				this.field.assertValue()
			}
			var b = this.getValue();
			if (!this.field.isValid()) {
				if (this.revertInvalid !== false) {
					this.cancelEdit(a)
				}
				return
			}
			if (String(b) === String(this.startValue) && this.ignoreNoChange) {
				this.hideEdit(a);
				return
			}
			if (this.fireEvent("beforecomplete", this, b, this.startValue) !== false) {
				b = this.getValue();
				if (this.updateEl && this.boundEl) {
					this.boundEl.update(b)
				}
				this.hideEdit(a);
				this.fireEvent("complete", this, b, this.startValue)
			}
		},
		onShow : function () {
			this.el.show();
			if (this.hideEl !== false) {
				this.boundEl.hide()
			}
			this.field.show().focus(false, true);
			this.fireEvent("startedit", this.boundEl, this.startValue)
		},
		cancelEdit : function (a) {
			if (this.editing) {
				var b = this.getValue();
				this.setValue(this.startValue);
				this.hideEdit(a);
				this.fireEvent("canceledit", this, b, this.startValue)
			}
		},
		hideEdit : function (a) {
			if (a !== true) {
				this.editing = false;
				this.hide()
			}
		},
		onBlur : function () {
			if (this.allowBlur === true && this.editing && this.selectSameEditor !== true) {
				this.completeEdit()
			}
		},
		onHide : function () {
			if (this.editing) {
				this.completeEdit();
				return
			}
			this.field.blur();
			if (this.field.collapse) {
				this.field.collapse()
			}
			this.el.hide();
			if (this.hideEl !== false) {
				this.boundEl.show()
			}
		},
		setValue : function (a) {
			this.field.setValue(a)
		},
		getValue : function () {
			return this.field.getValue()
		},
		beforeDestroy : function () {
			Ext.destroyMembers(this, "field");
			delete this.parentEl;
			delete this.boundEl
		}
	});
Ext.reg("editor", Ext.Editor);
Ext.ColorPalette = Ext.extend(Ext.Component, {
			itemCls : "x-color-palette",
			value : null,
			clickEvent : "click",
			ctype : "Ext.ColorPalette",
			allowReselect : false,
			colors : ["000000", "993300", "333300", "003300", "003366", "000080", "333399", "333333", "800000", "FF6600", "808000", "008000", "008080", "0000FF", "666699", "808080", "FF0000", "FF9900", "99CC00", "339966", "33CCCC", "3366FF", "800080", "969696", "FF00FF", "FFCC00", "FFFF00", "00FF00", "00FFFF", "00CCFF", "993366", "C0C0C0", "FF99CC", "FFCC99", "FFFF99", "CCFFCC", "CCFFFF", "99CCFF", "CC99FF", "FFFFFF"],
			initComponent : function () {
				Ext.ColorPalette.superclass.initComponent.call(this);
				this.addEvents("select");
				if (this.handler) {
					this.on("select", this.handler, this.scope, true)
				}
			},
			onRender : function (b, a) {
				this.autoEl = {
					tag : "div",
					cls : this.itemCls
				};
				Ext.ColorPalette.superclass.onRender.call(this, b, a);
				var c = this.tpl || new Ext.XTemplate('<tpl for="."><a href="#" class="color-{.}" hidefocus="on"><em><span style="background:#{.}" unselectable="on">&#160;</span></em></a></tpl>');
				c.overwrite(this.el, this.colors);
				this.mon(this.el, this.clickEvent, this.handleClick, this, {
						delegate : "a"
					});
				if (this.clickEvent != "click") {
					this.mon(this.el, "click", Ext.emptyFn, this, {
							delegate : "a",
							preventDefault : true
						})
				}
			},
			afterRender : function () {
				Ext.ColorPalette.superclass.afterRender.call(this);
				if (this.value) {
					var a = this.value;
					this.value = null;
					this.select(a, true)
				}
			},
			handleClick : function (b, a) {
				b.preventDefault();
				if (!this.disabled) {
					var d = a.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];
					this.select(d.toUpperCase())
				}
			},
			select : function (b, a) {
				b = b.replace("#", "");
				if (b != this.value || this.allowReselect) {
					var c = this.el;
					if (this.value) {
						c.child("a.color-" + this.value).removeClass("x-color-palette-sel")
					}
					c.child("a.color-" + b).addClass("x-color-palette-sel");
					this.value = b;
					if (a !== true) {
						this.fireEvent("select", this, b)
					}
				}
			}
		});
Ext.reg("colorpalette", Ext.ColorPalette);
Ext.DatePicker = Ext.extend(Ext.BoxComponent, {
			todayText : "Today",
			okText : "&#160;OK&#160;",
			cancelText : "Cancel",
			todayTip : "{0} (Spacebar)",
			minText : "This date is before the minimum date",
			maxText : "This date is after the maximum date",
			format : "m/d/y",
			disabledDaysText : "Disabled",
			disabledDatesText : "Disabled",
			monthNames : Date.monthNames,
			dayNames : Date.dayNames,
			nextText : "Next Month (Control+Right)",
			prevText : "Previous Month (Control+Left)",
			monthYearText : "Choose a month (Control+Up/Down to move years)",
			startDay : 0,
			showToday : true,
			focusOnSelect : true,
			initHour : 12,
			initComponent : function () {
				Ext.DatePicker.superclass.initComponent.call(this);
				this.value = this.value ? this.value.clearTime(true) : new Date().clearTime();
				this.addEvents("select");
				if (this.handler) {
					this.on("select", this.handler, this.scope || this)
				}
				this.initDisabledDays()
			},
			initDisabledDays : function () {
				if (!this.disabledDatesRE && this.disabledDates) {
					var b = this.disabledDates,
					a = b.length - 1,
					c = "(?:";
					Ext.each(b, function (g, e) {
							c += Ext.isDate(g) ? "^" + Ext.escapeRe(g.dateFormat(this.format)) + "$" : b[e];
							if (e != a) {
								c += "|"
							}
						}, this);
					this.disabledDatesRE = new RegExp(c + ")")
				}
			},
			setDisabledDates : function (a) {
				if (Ext.isArray(a)) {
					this.disabledDates = a;
					this.disabledDatesRE = null
				} else {
					this.disabledDatesRE = a
				}
				this.initDisabledDays();
				this.update(this.value, true)
			},
			setDisabledDays : function (a) {
				this.disabledDays = a;
				this.update(this.value, true)
			},
			setMinDate : function (a) {
				this.minDate = a;
				this.update(this.value, true)
			},
			setMaxDate : function (a) {
				this.maxDate = a;
				this.update(this.value, true)
			},
			setValue : function (a) {
				this.value = a.clearTime(true);
				this.update(this.value)
			},
			getValue : function () {
				return this.value
			},
			focus : function () {
				this.update(this.activeDate)
			},
			onEnable : function (a) {
				Ext.DatePicker.superclass.onEnable.call(this);
				this.doDisabled(false);
				this.update(a ? this.value : this.activeDate);
				if (Ext.isIE) {
					this.el.repaint()
				}
			},
			onDisable : function () {
				Ext.DatePicker.superclass.onDisable.call(this);
				this.doDisabled(true);
				if (Ext.isIE && !Ext.isIE8) {
					Ext.each([].concat(this.textNodes, this.el.query("th span")), function (a) {
							Ext.fly(a).repaint()
						})
				}
			},
			doDisabled : function (a) {
				this.keyNav.setDisabled(a);
				this.prevRepeater.setDisabled(a);
				this.nextRepeater.setDisabled(a);
				if (this.showToday) {
					this.todayKeyListener.setDisabled(a);
					this.todayBtn.setDisabled(a)
				}
			},
			onRender : function (e, b) {
				var a = ['<table cellspacing="0">', '<tr><td class="x-date-left"><a href="#" title="', this.prevText, '">&#160;</a></td><td class="x-date-middle" align="center"></td><td class="x-date-right"><a href="#" title="', this.nextText, '">&#160;</a></td></tr>', '<tr><td colspan="3"><table class="x-date-inner" cellspacing="0"><thead><tr>'],
				c = this.dayNames,
				h;
				for (h = 0; h < 7; h++) {
					var k = this.startDay + h;
					if (k > 6) {
						k = k - 7
					}
					a.push("<th><span>", c[k].substr(0, 1), "</span></th>")
				}
				a[a.length] = "</tr></thead><tbody><tr>";
				for (h = 0; h < 42; h++) {
					if (h % 7 === 0 && h !== 0) {
						a[a.length] = "</tr><tr>"
					}
					a[a.length] = '<td><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span></span></em></a></td>'
				}
				a.push("</tr></tbody></table></td></tr>", this.showToday ? '<tr><td colspan="3" class="x-date-bottom" align="center"></td></tr>' : "", '</table><div class="x-date-mp"></div>');
				var j = document.createElement("div");
				j.className = "x-date-picker";
				j.innerHTML = a.join("");
				e.dom.insertBefore(j, b);
				this.el = Ext.get(j);
				this.eventEl = Ext.get(j.firstChild);
				this.prevRepeater = new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"), {
							handler : this.showPrevMonth,
							scope : this,
							preventDefault : true,
							stopDefault : true
						});
				this.nextRepeater = new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"), {
							handler : this.showNextMonth,
							scope : this,
							preventDefault : true,
							stopDefault : true
						});
				this.monthPicker = this.el.down("div.x-date-mp");
				this.monthPicker.enableDisplayMode("block");
				this.keyNav = new Ext.KeyNav(this.eventEl, {
							left : function (d) {
								if (d.ctrlKey) {
									this.showPrevMonth()
								} else {
									this.update(this.activeDate.add("d", -1))
								}
							},
							right : function (d) {
								if (d.ctrlKey) {
									this.showNextMonth()
								} else {
									this.update(this.activeDate.add("d", 1))
								}
							},
							up : function (d) {
								if (d.ctrlKey) {
									this.showNextYear()
								} else {
									this.update(this.activeDate.add("d", -7))
								}
							},
							down : function (d) {
								if (d.ctrlKey) {
									this.showPrevYear()
								} else {
									this.update(this.activeDate.add("d", 7))
								}
							},
							pageUp : function (d) {
								this.showNextMonth()
							},
							pageDown : function (d) {
								this.showPrevMonth()
							},
							enter : function (d) {
								d.stopPropagation();
								return true
							},
							scope : this
						});
				this.el.unselectable();
				this.cells = this.el.select("table.x-date-inner tbody td");
				this.textNodes = this.el.query("table.x-date-inner tbody span");
				this.mbtn = new Ext.Button({
							text : "&#160;",
							tooltip : this.monthYearText,
							renderTo : this.el.child("td.x-date-middle", true)
						});
				this.mbtn.el.child("em").addClass("x-btn-arrow");
				if (this.showToday) {
					this.todayKeyListener = this.eventEl.addKeyListener(Ext.EventObject.SPACE, this.selectToday, this);
					var g = (new Date()).dateFormat(this.format);
					this.todayBtn = new Ext.Button({
								renderTo : this.el.child("td.x-date-bottom", true),
								text : String.format(this.todayText, g),
								tooltip : String.format(this.todayTip, g),
								handler : this.selectToday,
								scope : this
							})
				}
				this.mon(this.eventEl, "mousewheel", this.handleMouseWheel, this);
				this.mon(this.eventEl, "click", this.handleDateClick, this, {
						delegate : "a.x-date-date"
					});
				this.mon(this.mbtn, "click", this.showMonthPicker, this);
				this.onEnable(true)
			},
			createMonthPicker : function () {
				if (!this.monthPicker.dom.firstChild) {
					var a = ['<table border="0" cellspacing="0">'];
					for (var b = 0; b < 6; b++) {
						a.push('<tr><td class="x-date-mp-month"><a href="#">', Date.getShortMonthName(b), "</a></td>", '<td class="x-date-mp-month x-date-mp-sep"><a href="#">', Date.getShortMonthName(b + 6), "</a></td>", b === 0 ? '<td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-prev"></a></td><td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-next"></a></td></tr>' : '<td class="x-date-mp-year"><a href="#"></a></td><td class="x-date-mp-year"><a href="#"></a></td></tr>')
					}
					a.push('<tr class="x-date-mp-btns"><td colspan="4"><button type="button" class="x-date-mp-ok">', this.okText, '</button><button type="button" class="x-date-mp-cancel">', this.cancelText, "</button></td></tr>", "</table>");
					this.monthPicker.update(a.join(""));
					this.mon(this.monthPicker, "click", this.onMonthClick, this);
					this.mon(this.monthPicker, "dblclick", this.onMonthDblClick, this);
					this.mpMonths = this.monthPicker.select("td.x-date-mp-month");
					this.mpYears = this.monthPicker.select("td.x-date-mp-year");
					this.mpMonths.each(function (c, d, e) {
							e += 1;
							if ((e % 2) === 0) {
								c.dom.xmonth = 5 + Math.round(e * 0.5)
							} else {
								c.dom.xmonth = Math.round((e - 1) * 0.5)
							}
						})
				}
			},
			showMonthPicker : function () {
				if (!this.disabled) {
					this.createMonthPicker();
					var a = this.el.getSize();
					this.monthPicker.setSize(a);
					this.monthPicker.child("table").setSize(a);
					this.mpSelMonth = (this.activeDate || this.value).getMonth();
					this.updateMPMonth(this.mpSelMonth);
					this.mpSelYear = (this.activeDate || this.value).getFullYear();
					this.updateMPYear(this.mpSelYear);
					this.monthPicker.slideIn("t", {
							duration : 0.2
						})
				}
			},
			updateMPYear : function (e) {
				this.mpyear = e;
				var c = this.mpYears.elements;
				for (var b = 1; b <= 10; b++) {
					var d = c[b - 1],
					a;
					if ((b % 2) === 0) {
						a = e + Math.round(b * 0.5);
						d.firstChild.innerHTML = a;
						d.xyear = a
					} else {
						a = e - (5 - Math.round(b * 0.5));
						d.firstChild.innerHTML = a;
						d.xyear = a
					}
					this.mpYears.item(b - 1)[a == this.mpSelYear ? "addClass" : "removeClass"]("x-date-mp-sel")
				}
			},
			updateMPMonth : function (a) {
				this.mpMonths.each(function (b, c, d) {
						b[b.dom.xmonth == a ? "addClass" : "removeClass"]("x-date-mp-sel")
					})
			},
			selectMPMonth : function (a) {},
			onMonthClick : function (g, b) {
				g.stopEvent();
				var c = new Ext.Element(b),
				a;
				if (c.is("button.x-date-mp-cancel")) {
					this.hideMonthPicker()
				} else {
					if (c.is("button.x-date-mp-ok")) {
						var h = new Date(this.mpSelYear, this.mpSelMonth, (this.activeDate || this.value).getDate());
						if (h.getMonth() != this.mpSelMonth) {
							h = new Date(this.mpSelYear, this.mpSelMonth, 1).getLastDateOfMonth()
						}
						this.update(h);
						this.hideMonthPicker()
					} else {
						if ((a = c.up("td.x-date-mp-month", 2))) {
							this.mpMonths.removeClass("x-date-mp-sel");
							a.addClass("x-date-mp-sel");
							this.mpSelMonth = a.dom.xmonth
						} else {
							if ((a = c.up("td.x-date-mp-year", 2))) {
								this.mpYears.removeClass("x-date-mp-sel");
								a.addClass("x-date-mp-sel");
								this.mpSelYear = a.dom.xyear
							} else {
								if (c.is("a.x-date-mp-prev")) {
									this.updateMPYear(this.mpyear - 10)
								} else {
									if (c.is("a.x-date-mp-next")) {
										this.updateMPYear(this.mpyear + 10)
									}
								}
							}
						}
					}
				}
			},
			onMonthDblClick : function (d, b) {
				d.stopEvent();
				var c = new Ext.Element(b),
				a;
				if ((a = c.up("td.x-date-mp-month", 2))) {
					this.update(new Date(this.mpSelYear, a.dom.xmonth, (this.activeDate || this.value).getDate()));
					this.hideMonthPicker()
				} else {
					if ((a = c.up("td.x-date-mp-year", 2))) {
						this.update(new Date(a.dom.xyear, this.mpSelMonth, (this.activeDate || this.value).getDate()));
						this.hideMonthPicker()
					}
				}
			},
			hideMonthPicker : function (a) {
				if (this.monthPicker) {
					if (a === true) {
						this.monthPicker.hide()
					} else {
						this.monthPicker.slideOut("t", {
								duration : 0.2
							})
					}
				}
			},
			showPrevMonth : function (a) {
				this.update(this.activeDate.add("mo", -1))
			},
			showNextMonth : function (a) {
				this.update(this.activeDate.add("mo", 1))
			},
			showPrevYear : function () {
				this.update(this.activeDate.add("y", -1))
			},
			showNextYear : function () {
				this.update(this.activeDate.add("y", 1))
			},
			handleMouseWheel : function (a) {
				a.stopEvent();
				if (!this.disabled) {
					var b = a.getWheelDelta();
					if (b > 0) {
						this.showPrevMonth()
					} else {
						if (b < 0) {
							this.showNextMonth()
						}
					}
				}
			},
			handleDateClick : function (b, a) {
				b.stopEvent();
				if (!this.disabled && a.dateValue && !Ext.fly(a.parentNode).hasClass("x-date-disabled")) {
					this.cancelFocus = this.focusOnSelect === false;
					this.setValue(new Date(a.dateValue));
					delete this.cancelFocus;
					this.fireEvent("select", this, this.value)
				}
			},
			selectToday : function () {
				if (this.todayBtn && !this.todayBtn.disabled) {
					this.setValue(new Date().clearTime());
					this.fireEvent("select", this, this.value)
				}
			},
			update : function (G, A) {
				if (this.rendered) {
					var a = this.activeDate,
					p = this.isVisible();
					this.activeDate = G;
					if (!A && a && this.el) {
						var o = G.getTime();
						if (a.getMonth() == G.getMonth() && a.getFullYear() == G.getFullYear()) {
							this.cells.removeClass("x-date-selected");
							this.cells.each(function (d) {
									if (d.dom.firstChild.dateValue == o) {
										d.addClass("x-date-selected");
										if (p && !this.cancelFocus) {
											Ext.fly(d.dom.firstChild).focus(50)
										}
										return false
									}
								}, this);
							return
						}
					}
					var k = G.getDaysInMonth(),
					q = G.getFirstDateOfMonth(),
					g = q.getDay() - this.startDay;
					if (g < 0) {
						g += 7
					}
					k += g;
					var B = G.add("mo", -1),
					h = B.getDaysInMonth() - g,
					e = this.cells.elements,
					r = this.textNodes,
					D = (new Date(B.getFullYear(), B.getMonth(), h, this.initHour)),
					C = new Date().clearTime().getTime(),
					v = G.clearTime(true).getTime(),
					u = this.minDate ? this.minDate.clearTime(true) : Number.NEGATIVE_INFINITY,
					y = this.maxDate ? this.maxDate.clearTime(true) : Number.POSITIVE_INFINITY,
					F = this.disabledDatesRE,
					s = this.disabledDatesText,
					I = this.disabledDays ? this.disabledDays.join("") : false,
					E = this.disabledDaysText,
					z = this.format;
					if (this.showToday) {
						var m = new Date().clearTime(),
						c = (m < u || m > y || (F && z && F.test(m.dateFormat(z))) || (I && I.indexOf(m.getDay()) != -1));
						if (!this.disabled) {
							this.todayBtn.setDisabled(c);
							this.todayKeyListener[c ? "disable" : "enable"]()
						}
					}
					var l = function (J, d) {
						d.title = "";
						var i = D.clearTime(true).getTime();
						d.firstChild.dateValue = i;
						if (i == C) {
							d.className += " x-date-today";
							d.title = J.todayText
						}
						if (i == v) {
							d.className += " x-date-selected";
							if (p) {
								Ext.fly(d.firstChild).focus(50)
							}
						}
						if (i < u) {
							d.className = " x-date-disabled";
							d.title = J.minText;
							return
						}
						if (i > y) {
							d.className = " x-date-disabled";
							d.title = J.maxText;
							return
						}
						if (I) {
							if (I.indexOf(D.getDay()) != -1) {
								d.title = E;
								d.className = " x-date-disabled"
							}
						}
						if (F && z) {
							var w = D.dateFormat(z);
							if (F.test(w)) {
								d.title = s.replace("%0", w);
								d.className = " x-date-disabled"
							}
						}
					};
					var x = 0;
					for (; x < g; x++) {
						r[x].innerHTML = (++h);
						D.setDate(D.getDate() + 1);
						e[x].className = "x-date-prevday";
						l(this, e[x])
					}
					for (; x < k; x++) {
						var b = x - g + 1;
						r[x].innerHTML = (b);
						D.setDate(D.getDate() + 1);
						e[x].className = "x-date-active";
						l(this, e[x])
					}
					var H = 0;
					for (; x < 42; x++) {
						r[x].innerHTML = (++H);
						D.setDate(D.getDate() + 1);
						e[x].className = "x-date-nextday";
						l(this, e[x])
					}
					this.mbtn.setText(this.monthNames[G.getMonth()] + " " + G.getFullYear());
					if (!this.internalRender) {
						var j = this.el.dom.firstChild,
						n = j.offsetWidth;
						this.el.setWidth(n + this.el.getBorderWidth("lr"));
						Ext.fly(j).setWidth(n);
						this.internalRender = true;
						if (Ext.isOpera && !this.secondPass) {
							j.rows[0].cells[1].style.width = (n - (j.rows[0].cells[0].offsetWidth + j.rows[0].cells[2].offsetWidth)) + "px";
							this.secondPass = true;
							this.update.defer(10, this, [G])
						}
					}
				}
			},
			beforeDestroy : function () {
				if (this.rendered) {
					Ext.destroy(this.keyNav, this.monthPicker, this.eventEl, this.mbtn, this.nextRepeater, this.prevRepeater, this.cells.el, this.todayBtn);
					delete this.textNodes;
					delete this.cells.elements
				}
			}
		});
Ext.reg("datepicker", Ext.DatePicker);
Ext.LoadMask = function (c, b) {
	this.el = Ext.get(c);
	Ext.apply(this, b);
	if (this.store) {
		this.store.on({
				scope : this,
				beforeload : this.onBeforeLoad,
				load : this.onLoad,
				exception : this.onLoad
			});
		this.removeMask = Ext.value(this.removeMask, false)
	} else {
		var a = this.el.getUpdater();
		a.showLoadIndicator = false;
		a.on({
				scope : this,
				beforeupdate : this.onBeforeLoad,
				update : this.onLoad,
				failure : this.onLoad
			});
		this.removeMask = Ext.value(this.removeMask, true)
	}
};
Ext.LoadMask.prototype = {
	msg : "Loading...",
	msgCls : "x-mask-loading",
	disabled : false,
	disable : function () {
		this.disabled = true
	},
	enable : function () {
		this.disabled = false
	},
	onLoad : function () {
		this.el.unmask(this.removeMask)
	},
	onBeforeLoad : function () {
		if (!this.disabled) {
			this.el.mask(this.msg, this.msgCls)
		}
	},
	show : function () {
		this.onBeforeLoad()
	},
	hide : function () {
		this.onLoad()
	},
	destroy : function () {
		if (this.store) {
			this.store.un("beforeload", this.onBeforeLoad, this);
			this.store.un("load", this.onLoad, this);
			this.store.un("exception", this.onLoad, this)
		} else {
			var a = this.el.getUpdater();
			a.un("beforeupdate", this.onBeforeLoad, this);
			a.un("update", this.onLoad, this);
			a.un("failure", this.onLoad, this)
		}
	}
};
Ext.slider.Thumb = Ext.extend(Object, {
			dragging : false,
			constructor : function (a) {
				Ext.apply(this, a || {}, {
						cls : "x-slider-thumb",
						constrain : false
					});
				Ext.slider.Thumb.superclass.constructor.call(this, a);
				if (this.slider.vertical) {
					Ext.apply(this, Ext.slider.Thumb.Vertical)
				}
			},
			render : function () {
				this.el = this.slider.innerEl.insertFirst({
							cls : this.cls
						});
				this.initEvents()
			},
			enable : function () {
				this.disabled = false;
				this.el.removeClass(this.slider.disabledClass)
			},
			disable : function () {
				this.disabled = true;
				this.el.addClass(this.slider.disabledClass)
			},
			initEvents : function () {
				var a = this.el;
				a.addClassOnOver("x-slider-thumb-over");
				this.tracker = new Ext.dd.DragTracker({
							onBeforeStart : this.onBeforeDragStart.createDelegate(this),
							onStart : this.onDragStart.createDelegate(this),
							onDrag : this.onDrag.createDelegate(this),
							onEnd : this.onDragEnd.createDelegate(this),
							tolerance : 3,
							autoStart : 300
						});
				this.tracker.initEl(a)
			},
			onBeforeDragStart : function (a) {
				if (this.disabled) {
					return false
				} else {
					this.slider.promoteThumb(this);
					return true
				}
			},
			onDragStart : function (a) {
				this.el.addClass("x-slider-thumb-drag");
				this.dragging = true;
				this.dragStartValue = this.value;
				this.slider.fireEvent("dragstart", this.slider, a, this)
			},
			onDrag : function (g) {
				var c = this.slider,
				b = this.index,
				d = this.getNewValue();
				if (this.constrain) {
					var a = c.thumbs[b + 1],
					h = c.thumbs[b - 1];
					if (h != undefined && d <= h.value) {
						d = h.value
					}
					if (a != undefined && d >= a.value) {
						d = a.value
					}
				}
				c.setValue(b, d, false);
				c.fireEvent("drag", c, g, this)
			},
			getNewValue : function () {
				var a = this.slider,
				b = a.innerEl.translatePoints(this.tracker.getXY());
				return Ext.util.Format.round(a.reverseValue(b.left), a.decimalPrecision)
			},
			onDragEnd : function (c) {
				var a = this.slider,
				b = this.value;
				this.el.removeClass("x-slider-thumb-drag");
				this.dragging = false;
				a.fireEvent("dragend", a, c);
				if (this.dragStartValue != b) {
					a.fireEvent("changecomplete", a, b, this)
				}
			},
			destroy : function () {
				Ext.destroyMembers(this, "tracker", "el")
			}
		});
Ext.slider.MultiSlider = Ext.extend(Ext.BoxComponent, {
			vertical : false,
			minValue : 0,
			maxValue : 100,
			decimalPrecision : 0,
			keyIncrement : 1,
			increment : 0,
			clickRange : [5, 15],
			clickToChange : true,
			animate : true,
			constrainThumbs : true,
			topThumbZIndex : 10000,
			initComponent : function () {
				if (!Ext.isDefined(this.value)) {
					this.value = this.minValue
				}
				this.thumbs = [];
				Ext.slider.MultiSlider.superclass.initComponent.call(this);
				this.keyIncrement = Math.max(this.increment, this.keyIncrement);
				this.addEvents("beforechange", "change", "changecomplete", "dragstart", "drag", "dragend");
				if (this.values == undefined || Ext.isEmpty(this.values)) {
					this.values = [0]
				}
				var a = this.values;
				for (var b = 0; b < a.length; b++) {
					this.addThumb(a[b])
				}
				if (this.vertical) {
					Ext.apply(this, Ext.slider.Vertical)
				}
			},
			addThumb : function (b) {
				var a = new Ext.slider.Thumb({
							value : b,
							slider : this,
							index : this.thumbs.length,
							constrain : this.constrainThumbs
						});
				this.thumbs.push(a);
				if (this.rendered) {
					a.render()
				}
			},
			promoteThumb : function (d) {
				var a = this.thumbs,
				g,
				b;
				for (var e = 0, c = a.length; e < c; e++) {
					b = a[e];
					if (b == d) {
						g = this.topThumbZIndex
					} else {
						g = ""
					}
					b.el.setStyle("zIndex", g)
				}
			},
			onRender : function () {
				this.autoEl = {
					cls : "x-slider " + (this.vertical ? "x-slider-vert" : "x-slider-horz"),
					cn : {
						cls : "x-slider-end",
						cn : {
							cls : "x-slider-inner",
							cn : [{
									tag : "a",
									cls : "x-slider-focus",
									href : "#",
									tabIndex : "-1",
									hidefocus : "on"
								}
							]
						}
					}
				};
				Ext.slider.MultiSlider.superclass.onRender.apply(this, arguments);
				this.endEl = this.el.first();
				this.innerEl = this.endEl.first();
				this.focusEl = this.innerEl.child(".x-slider-focus");
				for (var b = 0; b < this.thumbs.length; b++) {
					this.thumbs[b].render()
				}
				var a = this.innerEl.child(".x-slider-thumb");
				this.halfThumb = (this.vertical ? a.getHeight() : a.getWidth()) / 2;
				this.initEvents()
			},
			initEvents : function () {
				this.mon(this.el, {
						scope : this,
						mousedown : this.onMouseDown,
						keydown : this.onKeyDown
					});
				this.focusEl.swallowEvent("click", true)
			},
			onMouseDown : function (d) {
				if (this.disabled) {
					return
				}
				var c = false;
				for (var b = 0; b < this.thumbs.length; b++) {
					c = c || d.target == this.thumbs[b].el.dom
				}
				if (this.clickToChange && !c) {
					var a = this.innerEl.translatePoints(d.getXY());
					this.onClickChange(a)
				}
				this.focus()
			},
			onClickChange : function (c) {
				if (c.top > this.clickRange[0] && c.top < this.clickRange[1]) {
					var a = this.getNearest(c, "left"),
					b = a.index;
					this.setValue(b, Ext.util.Format.round(this.reverseValue(c.left), this.decimalPrecision), undefined, true)
				}
			},
			getNearest : function (k, b) {
				var m = b == "top" ? this.innerEl.getHeight() - k[b] : k[b],
				g = this.reverseValue(m),
				j = (this.maxValue - this.minValue) + 5,
				e = 0,
				c = null;
				for (var d = 0; d < this.thumbs.length; d++) {
					var a = this.thumbs[d],
					l = a.value,
					h = Math.abs(l - g);
					if (Math.abs(h <= j)) {
						c = a;
						e = d;
						j = h
					}
				}
				return c
			},
			onKeyDown : function (b) {
				if (this.disabled || this.thumbs.length !== 1) {
					b.preventDefault();
					return
				}
				var a = b.getKey(),
				c;
				switch (a) {
				case b.UP:
				case b.RIGHT:
					b.stopEvent();
					c = b.ctrlKey ? this.maxValue : this.getValue(0) + this.keyIncrement;
					this.setValue(0, c, undefined, true);
					break;
				case b.DOWN:
				case b.LEFT:
					b.stopEvent();
					c = b.ctrlKey ? this.minValue : this.getValue(0) - this.keyIncrement;
					this.setValue(0, c, undefined, true);
					break;
				default:
					b.preventDefault()
				}
			},
			doSnap : function (b) {
				if (!(this.increment && b)) {
					return b
				}
				var d = b,
				c = this.increment,
				a = b % c;
				if (a != 0) {
					d -= a;
					if (a * 2 >= c) {
						d += c
					} else {
						if (a * 2 < -c) {
							d -= c
						}
					}
				}
				return d.constrain(this.minValue, this.maxValue)
			},
			afterRender : function () {
				Ext.slider.MultiSlider.superclass.afterRender.apply(this, arguments);
				for (var c = 0; c < this.thumbs.length; c++) {
					var b = this.thumbs[c];
					if (b.value !== undefined) {
						var a = this.normalizeValue(b.value);
						if (a !== b.value) {
							this.setValue(c, a, false)
						} else {
							this.moveThumb(c, this.translateValue(a), false)
						}
					}
				}
			},
			getRatio : function () {
				var a = this.innerEl.getWidth(),
				b = this.maxValue - this.minValue;
				return b == 0 ? a : (a / b)
			},
			normalizeValue : function (a) {
				a = this.doSnap(a);
				a = Ext.util.Format.round(a, this.decimalPrecision);
				a = a.constrain(this.minValue, this.maxValue);
				return a
			},
			setMinValue : function (e) {
				this.minValue = e;
				var d = 0,
				b = this.thumbs,
				a = b.length,
				c;
				for (; d < a; ++d) {
					c = b[d];
					c.value = c.value < e ? e : c.value
				}
				this.syncThumb()
			},
			setMaxValue : function (e) {
				this.maxValue = e;
				var d = 0,
				b = this.thumbs,
				a = b.length,
				c;
				for (; d < a; ++d) {
					c = b[d];
					c.value = c.value > e ? e : c.value
				}
				this.syncThumb()
			},
			setValue : function (d, c, b, g) {
				var a = this.thumbs[d],
				e = a.el;
				c = this.normalizeValue(c);
				if (c !== a.value && this.fireEvent("beforechange", this, c, a.value, a) !== false) {
					a.value = c;
					if (this.rendered) {
						this.moveThumb(d, this.translateValue(c), b !== false);
						this.fireEvent("change", this, c, a);
						if (g) {
							this.fireEvent("changecomplete", this, c, a)
						}
					}
				}
			},
			translateValue : function (a) {
				var b = this.getRatio();
				return (a * b) - (this.minValue * b) - this.halfThumb
			},
			reverseValue : function (b) {
				var a = this.getRatio();
				return (b + (this.minValue * a)) / a
			},
			moveThumb : function (d, c, b) {
				var a = this.thumbs[d].el;
				if (!b || this.animate === false) {
					a.setLeft(c)
				} else {
					a.shift({
							left : c,
							stopFx : true,
							duration : 0.35
						})
				}
			},
			focus : function () {
				this.focusEl.focus(10)
			},
			onResize : function (c, e) {
				var b = this.thumbs,
				a = b.length,
				d = 0;
				for (; d < a; ++d) {
					b[d].el.stopFx()
				}
				if (Ext.isNumber(c)) {
					this.innerEl.setWidth(c - (this.el.getPadding("l") + this.endEl.getPadding("r")))
				}
				this.syncThumb();
				Ext.slider.MultiSlider.superclass.onResize.apply(this, arguments)
			},
			onDisable : function () {
				Ext.slider.MultiSlider.superclass.onDisable.call(this);
				for (var b = 0; b < this.thumbs.length; b++) {
					var a = this.thumbs[b],
					c = a.el;
					a.disable();
					if (Ext.isIE) {
						var d = c.getXY();
						c.hide();
						this.innerEl.addClass(this.disabledClass).dom.disabled = true;
						if (!this.thumbHolder) {
							this.thumbHolder = this.endEl.createChild({
										cls : "x-slider-thumb " + this.disabledClass
									})
						}
						this.thumbHolder.show().setXY(d)
					}
				}
			},
			onEnable : function () {
				Ext.slider.MultiSlider.superclass.onEnable.call(this);
				for (var b = 0; b < this.thumbs.length; b++) {
					var a = this.thumbs[b],
					c = a.el;
					a.enable();
					if (Ext.isIE) {
						this.innerEl.removeClass(this.disabledClass).dom.disabled = false;
						if (this.thumbHolder) {
							this.thumbHolder.hide()
						}
						c.show();
						this.syncThumb()
					}
				}
			},
			syncThumb : function () {
				if (this.rendered) {
					for (var a = 0; a < this.thumbs.length; a++) {
						this.moveThumb(a, this.translateValue(this.thumbs[a].value))
					}
				}
			},
			getValue : function (a) {
				return this.thumbs[a].value
			},
			getValues : function () {
				var a = [];
				for (var b = 0; b < this.thumbs.length; b++) {
					a.push(this.thumbs[b].value)
				}
				return a
			},
			beforeDestroy : function () {
				var b = this.thumbs;
				for (var c = 0, a = b.length; c < a; ++c) {
					b[c].destroy();
					b[c] = null
				}
				Ext.destroyMembers(this, "endEl", "innerEl", "focusEl", "thumbHolder");
				Ext.slider.MultiSlider.superclass.beforeDestroy.call(this)
			}
		});
Ext.reg("multislider", Ext.slider.MultiSlider);
Ext.slider.SingleSlider = Ext.extend(Ext.slider.MultiSlider, {
			constructor : function (a) {
				a = a || {};
				Ext.applyIf(a, {
						values : [a.value || 0]
					});
				Ext.slider.SingleSlider.superclass.constructor.call(this, a)
			},
			getValue : function () {
				return Ext.slider.SingleSlider.superclass.getValue.call(this, 0)
			},
			setValue : function (d, b) {
				var c = Ext.toArray(arguments),
				a = c.length;
				if (a == 1 || (a <= 3 && typeof arguments[1] != "number")) {
					c.unshift(0)
				}
				return Ext.slider.SingleSlider.superclass.setValue.apply(this, c)
			},
			syncThumb : function () {
				return Ext.slider.SingleSlider.superclass.syncThumb.apply(this, [0].concat(arguments))
			},
			getNearest : function () {
				return this.thumbs[0]
			}
		});
Ext.Slider = Ext.slider.SingleSlider;
Ext.reg("slider", Ext.slider.SingleSlider);
Ext.slider.Vertical = {
	onResize : function (a, b) {
		this.innerEl.setHeight(b - (this.el.getPadding("t") + this.endEl.getPadding("b")));
		this.syncThumb()
	},
	getRatio : function () {
		var b = this.innerEl.getHeight(),
		a = this.maxValue - this.minValue;
		return b / a
	},
	moveThumb : function (d, c, b) {
		var a = this.thumbs[d],
		e = a.el;
		if (!b || this.animate === false) {
			e.setBottom(c)
		} else {
			e.shift({
					bottom : c,
					stopFx : true,
					duration : 0.35
				})
		}
	},
	onClickChange : function (c) {
		if (c.left > this.clickRange[0] && c.left < this.clickRange[1]) {
			var a = this.getNearest(c, "top"),
			b = a.index,
			d = this.minValue + this.reverseValue(this.innerEl.getHeight() - c.top);
			this.setValue(b, Ext.util.Format.round(d, this.decimalPrecision), undefined, true)
		}
	}
};
Ext.slider.Thumb.Vertical = {
	getNewValue : function () {
		var b = this.slider,
		c = b.innerEl,
		d = c.translatePoints(this.tracker.getXY()),
		a = c.getHeight() - d.top;
		return b.minValue + Ext.util.Format.round(a / b.getRatio(), b.decimalPrecision)
	}
};
Ext.ProgressBar = Ext.extend(Ext.BoxComponent, {
			baseCls : "x-progress",
			animate : false,
			waitTimer : null,
			initComponent : function () {
				Ext.ProgressBar.superclass.initComponent.call(this);
				this.addEvents("update")
			},
			onRender : function (d, a) {
				var c = new Ext.Template('<div class="{cls}-wrap">', '<div class="{cls}-inner">', '<div class="{cls}-bar">', '<div class="{cls}-text">', "<div>&#160;</div>", "</div>", "</div>", '<div class="{cls}-text {cls}-text-back">', "<div>&#160;</div>", "</div>", "</div>", "</div>");
				this.el = a ? c.insertBefore(a, {
							cls : this.baseCls
						}, true) : c.append(d, {
							cls : this.baseCls
						}, true);
				if (this.id) {
					this.el.dom.id = this.id
				}
				var b = this.el.dom.firstChild;
				this.progressBar = Ext.get(b.firstChild);
				if (this.textEl) {
					this.textEl = Ext.get(this.textEl);
					delete this.textTopEl
				} else {
					this.textTopEl = Ext.get(this.progressBar.dom.firstChild);
					var e = Ext.get(b.childNodes[1]);
					this.textTopEl.setStyle("z-index", 99).addClass("x-hidden");
					this.textEl = new Ext.CompositeElement([this.textTopEl.dom.firstChild, e.dom.firstChild]);
					this.textEl.setWidth(b.offsetWidth)
				}
				this.progressBar.setHeight(b.offsetHeight)
			},
			afterRender : function () {
				Ext.ProgressBar.superclass.afterRender.call(this);
				if (this.value) {
					this.updateProgress(this.value, this.text)
				} else {
					this.updateText(this.text)
				}
			},
			updateProgress : function (c, d, b) {
				this.value = c || 0;
				if (d) {
					this.updateText(d)
				}
				if (this.rendered && !this.isDestroyed) {
					var a = Math.floor(c * this.el.dom.firstChild.offsetWidth);
					this.progressBar.setWidth(a, b === true || (b !== false && this.animate));
					if (this.textTopEl) {
						this.textTopEl.removeClass("x-hidden").setWidth(a)
					}
				}
				this.fireEvent("update", this, c, d);
				return this
			},
			wait : function (b) {
				if (!this.waitTimer) {
					var a = this;
					b = b || {};
					this.updateText(b.text);
					this.waitTimer = Ext.TaskMgr.start({
								run : function (c) {
									var d = b.increment || 10;
									c -= 1;
									this.updateProgress(((((c + d) % d) + 1) * (100 / d)) * 0.01, null, b.animate)
								},
								interval : b.interval || 1000,
								duration : b.duration,
								onStop : function () {
									if (b.fn) {
										b.fn.apply(b.scope || this)
									}
									this.reset()
								},
								scope : a
							})
				}
				return this
			},
			isWaiting : function () {
				return this.waitTimer !== null
			},
			updateText : function (a) {
				this.text = a || "&#160;";
				if (this.rendered) {
					this.textEl.update(this.text)
				}
				return this
			},
			syncProgressBar : function () {
				if (this.value) {
					this.updateProgress(this.value, this.text)
				}
				return this
			},
			setSize : function (a, c) {
				Ext.ProgressBar.superclass.setSize.call(this, a, c);
				if (this.textTopEl) {
					var b = this.el.dom.firstChild;
					this.textEl.setSize(b.offsetWidth, b.offsetHeight)
				}
				this.syncProgressBar();
				return this
			},
			reset : function (a) {
				this.updateProgress(0);
				if (this.textTopEl) {
					this.textTopEl.addClass("x-hidden")
				}
				this.clearTimer();
				if (a === true) {
					this.hide()
				}
				return this
			},
			clearTimer : function () {
				if (this.waitTimer) {
					this.waitTimer.onStop = null;
					Ext.TaskMgr.stop(this.waitTimer);
					this.waitTimer = null
				}
			},
			onDestroy : function () {
				this.clearTimer();
				if (this.rendered) {
					if (this.textEl.isComposite) {
						this.textEl.clear()
					}
					Ext.destroyMembers(this, "textEl", "progressBar", "textTopEl")
				}
				Ext.ProgressBar.superclass.onDestroy.call(this)
			}
		});
Ext.reg("progress", Ext.ProgressBar);
(function () {
		var a = Ext.EventManager;
		var b = Ext.lib.Dom;
		Ext.dd.DragDrop = function (e, c, d) {
			if (e) {
				this.init(e, c, d)
			}
		};
		Ext.dd.DragDrop.prototype = {
			id : null,
			config : null,
			dragElId : null,
			handleElId : null,
			invalidHandleTypes : null,
			invalidHandleIds : null,
			invalidHandleClasses : null,
			startPageX : 0,
			startPageY : 0,
			groups : null,
			locked : false,
			lock : function () {
				this.locked = true
			},
			moveOnly : false,
			unlock : function () {
				this.locked = false
			},
			isTarget : true,
			padding : null,
			_domRef : null,
			__ygDragDrop : true,
			constrainX : false,
			constrainY : false,
			minX : 0,
			maxX : 0,
			minY : 0,
			maxY : 0,
			maintainOffset : false,
			xTicks : null,
			yTicks : null,
			primaryButtonOnly : true,
			available : false,
			hasOuterHandles : false,
			b4StartDrag : function (c, d) {},
			startDrag : function (c, d) {},
			b4Drag : function (c) {},
			onDrag : function (c) {},
			onDragEnter : function (c, d) {},
			b4DragOver : function (c) {},
			onDragOver : function (c, d) {},
			b4DragOut : function (c) {},
			onDragOut : function (c, d) {},
			b4DragDrop : function (c) {},
			onDragDrop : function (c, d) {},
			onInvalidDrop : function (c) {},
			b4EndDrag : function (c) {},
			endDrag : function (c) {},
			b4MouseDown : function (c) {},
			onMouseDown : function (c) {},
			onMouseUp : function (c) {},
			onAvailable : function () {},
			defaultPadding : {
				left : 0,
				right : 0,
				top : 0,
				bottom : 0
			},
			constrainTo : function (j, h, o) {
				if (Ext.isNumber(h)) {
					h = {
						left : h,
						right : h,
						top : h,
						bottom : h
					}
				}
				h = h || this.defaultPadding;
				var l = Ext.get(this.getEl()).getBox(),
				d = Ext.get(j),
				n = d.getScroll(),
				k,
				e = d.dom;
				if (e == document.body) {
					k = {
						x : n.left,
						y : n.top,
						width : Ext.lib.Dom.getViewWidth(),
						height : Ext.lib.Dom.getViewHeight()
					}
				} else {
					var m = d.getXY();
					k = {
						x : m[0],
						y : m[1],
						width : e.clientWidth,
						height : e.clientHeight
					}
				}
				var i = l.y - k.y,
				g = l.x - k.x;
				this.resetConstraints();
				this.setXConstraint(g - (h.left || 0), k.width - g - l.width - (h.right || 0), this.xTickSize);
				this.setYConstraint(i - (h.top || 0), k.height - i - l.height - (h.bottom || 0), this.yTickSize)
			},
			getEl : function () {
				if (!this._domRef) {
					this._domRef = Ext.getDom(this.id)
				}
				return this._domRef
			},
			getDragEl : function () {
				return Ext.getDom(this.dragElId)
			},
			init : function (e, c, d) {
				this.initTarget(e, c, d);
				a.on(this.id, "mousedown", this.handleMouseDown, this)
			},
			initTarget : function (e, c, d) {
				this.config = d || {};
				this.DDM = Ext.dd.DDM;
				this.groups = {};
				if (typeof e !== "string") {
					e = Ext.id(e)
				}
				this.id = e;
				this.addToGroup((c) ? c : "default");
				this.handleElId = e;
				this.setDragElId(e);
				this.invalidHandleTypes = {
					A : "A"
				};
				this.invalidHandleIds = {};
				this.invalidHandleClasses = [];
				this.applyConfig();
				this.handleOnAvailable()
			},
			applyConfig : function () {
				this.padding = this.config.padding || [0, 0, 0, 0];
				this.isTarget = (this.config.isTarget !== false);
				this.maintainOffset = (this.config.maintainOffset);
				this.primaryButtonOnly = (this.config.primaryButtonOnly !== false)
			},
			handleOnAvailable : function () {
				this.available = true;
				this.resetConstraints();
				this.onAvailable()
			},
			setPadding : function (e, c, g, d) {
				if (!c && 0 !== c) {
					this.padding = [e, e, e, e]
				} else {
					if (!g && 0 !== g) {
						this.padding = [e, c, e, c]
					} else {
						this.padding = [e, c, g, d]
					}
				}
			},
			setInitPosition : function (g, e) {
				var h = this.getEl();
				if (!this.DDM.verifyEl(h)) {
					return
				}
				var d = g || 0;
				var c = e || 0;
				var i = b.getXY(h);
				this.initPageX = i[0] - d;
				this.initPageY = i[1] - c;
				this.lastPageX = i[0];
				this.lastPageY = i[1];
				this.setStartPosition(i)
			},
			setStartPosition : function (d) {
				var c = d || b.getXY(this.getEl());
				this.deltaSetXY = null;
				this.startPageX = c[0];
				this.startPageY = c[1]
			},
			addToGroup : function (c) {
				this.groups[c] = true;
				this.DDM.regDragDrop(this, c)
			},
			removeFromGroup : function (c) {
				if (this.groups[c]) {
					delete this.groups[c]
				}
				this.DDM.removeDDFromGroup(this, c)
			},
			setDragElId : function (c) {
				this.dragElId = c
			},
			setHandleElId : function (c) {
				if (typeof c !== "string") {
					c = Ext.id(c)
				}
				this.handleElId = c;
				this.DDM.regHandle(this.id, c)
			},
			setOuterHandleElId : function (c) {
				if (typeof c !== "string") {
					c = Ext.id(c)
				}
				a.on(c, "mousedown", this.handleMouseDown, this);
				this.setHandleElId(c);
				this.hasOuterHandles = true
			},
			unreg : function () {
				a.un(this.id, "mousedown", this.handleMouseDown);
				this._domRef = null;
				this.DDM._remove(this)
			},
			destroy : function () {
				this.unreg()
			},
			isLocked : function () {
				return (this.DDM.isLocked() || this.locked)
			},
			handleMouseDown : function (g, d) {
				if (this.primaryButtonOnly && g.button != 0) {
					return
				}
				if (this.isLocked()) {
					return
				}
				this.DDM.refreshCache(this.groups);
				var c = new Ext.lib.Point(Ext.lib.Event.getPageX(g), Ext.lib.Event.getPageY(g));
				if (!this.hasOuterHandles && !this.DDM.isOverTarget(c, this)) {}
				else {
					if (this.clickValidator(g)) {
						this.setStartPosition();
						this.b4MouseDown(g);
						this.onMouseDown(g);
						this.DDM.handleMouseDown(g, this);
						this.DDM.stopEvent(g)
					} else {}
					
				}
			},
			clickValidator : function (d) {
				var c = d.getTarget();
				return (this.isValidHandleChild(c) && (this.id == this.handleElId || this.DDM.handleWasClicked(c, this.id)))
			},
			addInvalidHandleType : function (c) {
				var d = c.toUpperCase();
				this.invalidHandleTypes[d] = d
			},
			addInvalidHandleId : function (c) {
				if (typeof c !== "string") {
					c = Ext.id(c)
				}
				this.invalidHandleIds[c] = c
			},
			addInvalidHandleClass : function (c) {
				this.invalidHandleClasses.push(c)
			},
			removeInvalidHandleType : function (c) {
				var d = c.toUpperCase();
				delete this.invalidHandleTypes[d]
			},
			removeInvalidHandleId : function (c) {
				if (typeof c !== "string") {
					c = Ext.id(c)
				}
				delete this.invalidHandleIds[c]
			},
			removeInvalidHandleClass : function (d) {
				for (var e = 0, c = this.invalidHandleClasses.length; e < c; ++e) {
					if (this.invalidHandleClasses[e] == d) {
						delete this.invalidHandleClasses[e]
					}
				}
			},
			isValidHandleChild : function (h) {
				var g = true;
				var k;
				try {
					k = h.nodeName.toUpperCase()
				} catch (j) {
					k = h.nodeName
				}
				g = g && !this.invalidHandleTypes[k];
				g = g && !this.invalidHandleIds[h.id];
				for (var d = 0, c = this.invalidHandleClasses.length; g && d < c; ++d) {
					g = !Ext.fly(h).hasClass(this.invalidHandleClasses[d])
				}
				return g
			},
			setXTicks : function (g, c) {
				this.xTicks = [];
				this.xTickSize = c;
				var e = {};
				for (var d = this.initPageX; d >= this.minX; d = d - c) {
					if (!e[d]) {
						this.xTicks[this.xTicks.length] = d;
						e[d] = true
					}
				}
				for (d = this.initPageX; d <= this.maxX; d = d + c) {
					if (!e[d]) {
						this.xTicks[this.xTicks.length] = d;
						e[d] = true
					}
				}
				this.xTicks.sort(this.DDM.numericSort)
			},
			setYTicks : function (g, c) {
				this.yTicks = [];
				this.yTickSize = c;
				var e = {};
				for (var d = this.initPageY; d >= this.minY; d = d - c) {
					if (!e[d]) {
						this.yTicks[this.yTicks.length] = d;
						e[d] = true
					}
				}
				for (d = this.initPageY; d <= this.maxY; d = d + c) {
					if (!e[d]) {
						this.yTicks[this.yTicks.length] = d;
						e[d] = true
					}
				}
				this.yTicks.sort(this.DDM.numericSort)
			},
			setXConstraint : function (e, d, c) {
				this.leftConstraint = e;
				this.rightConstraint = d;
				this.minX = this.initPageX - e;
				this.maxX = this.initPageX + d;
				if (c) {
					this.setXTicks(this.initPageX, c)
				}
				this.constrainX = true
			},
			clearConstraints : function () {
				this.constrainX = false;
				this.constrainY = false;
				this.clearTicks()
			},
			clearTicks : function () {
				this.xTicks = null;
				this.yTicks = null;
				this.xTickSize = 0;
				this.yTickSize = 0
			},
			setYConstraint : function (c, e, d) {
				this.topConstraint = c;
				this.bottomConstraint = e;
				this.minY = this.initPageY - c;
				this.maxY = this.initPageY + e;
				if (d) {
					this.setYTicks(this.initPageY, d)
				}
				this.constrainY = true
			},
			resetConstraints : function () {
				if (this.initPageX || this.initPageX === 0) {
					var d = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0;
					var c = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0;
					this.setInitPosition(d, c)
				} else {
					this.setInitPosition()
				}
				if (this.constrainX) {
					this.setXConstraint(this.leftConstraint, this.rightConstraint, this.xTickSize)
				}
				if (this.constrainY) {
					this.setYConstraint(this.topConstraint, this.bottomConstraint, this.yTickSize)
				}
			},
			getTick : function (k, g) {
				if (!g) {
					return k
				} else {
					if (g[0] >= k) {
						return g[0]
					} else {
						for (var d = 0, c = g.length; d < c; ++d) {
							var e = d + 1;
							if (g[e] && g[e] >= k) {
								var j = k - g[d];
								var h = g[e] - k;
								return (h > j) ? g[d] : g[e]
							}
						}
						return g[g.length - 1]
					}
				}
			},
			toString : function () {
				return ("DragDrop " + this.id)
			}
		}
	})();
if (!Ext.dd.DragDropMgr) {
	Ext.dd.DragDropMgr = function () {
		var a = Ext.EventManager;
		return {
			ids : {},
			handleIds : {},
			dragCurrent : null,
			dragOvers : {},
			deltaX : 0,
			deltaY : 0,
			preventDefault : true,
			stopPropagation : true,
			initialized : false,
			locked : false,
			init : function () {
				this.initialized = true
			},
			POINT : 0,
			INTERSECT : 1,
			mode : 0,
			_execOnAll : function (d, c) {
				for (var e in this.ids) {
					for (var b in this.ids[e]) {
						var g = this.ids[e][b];
						if (!this.isTypeOfDD(g)) {
							continue
						}
						g[d].apply(g, c)
					}
				}
			},
			_onLoad : function () {
				this.init();
				a.on(document, "mouseup", this.handleMouseUp, this, true);
				a.on(document, "mousemove", this.handleMouseMove, this, true);
				a.on(window, "unload", this._onUnload, this, true);
				a.on(window, "resize", this._onResize, this, true)
			},
			_onResize : function (b) {
				this._execOnAll("resetConstraints", [])
			},
			lock : function () {
				this.locked = true
			},
			unlock : function () {
				this.locked = false
			},
			isLocked : function () {
				return this.locked
			},
			locationCache : {},
			useCache : true,
			clickPixelThresh : 3,
			clickTimeThresh : 350,
			dragThreshMet : false,
			clickTimeout : null,
			startX : 0,
			startY : 0,
			regDragDrop : function (c, b) {
				if (!this.initialized) {
					this.init()
				}
				if (!this.ids[b]) {
					this.ids[b] = {}
					
				}
				this.ids[b][c.id] = c
			},
			removeDDFromGroup : function (d, b) {
				if (!this.ids[b]) {
					this.ids[b] = {}
					
				}
				var c = this.ids[b];
				if (c && c[d.id]) {
					delete c[d.id]
				}
			},
			_remove : function (c) {
				for (var b in c.groups) {
					if (b && this.ids[b] && this.ids[b][c.id]) {
						delete this.ids[b][c.id]
					}
				}
				delete this.handleIds[c.id]
			},
			regHandle : function (c, b) {
				if (!this.handleIds[c]) {
					this.handleIds[c] = {}
					
				}
				this.handleIds[c][b] = b
			},
			isDragDrop : function (b) {
				return (this.getDDById(b)) ? true : false
			},
			getRelated : function (h, c) {
				var g = [];
				for (var e in h.groups) {
					for (var d in this.ids[e]) {
						var b = this.ids[e][d];
						if (!this.isTypeOfDD(b)) {
							continue
						}
						if (!c || b.isTarget) {
							g[g.length] = b
						}
					}
				}
				return g
			},
			isLegalTarget : function (g, e) {
				var c = this.getRelated(g, true);
				for (var d = 0, b = c.length; d < b; ++d) {
					if (c[d].id == e.id) {
						return true
					}
				}
				return false
			},
			isTypeOfDD : function (b) {
				return (b && b.__ygDragDrop)
			},
			isHandle : function (c, b) {
				return (this.handleIds[c] && this.handleIds[c][b])
			},
			getDDById : function (c) {
				for (var b in this.ids) {
					if (this.ids[b][c]) {
						return this.ids[b][c]
					}
				}
				return null
			},
			handleMouseDown : function (d, c) {
				if (Ext.QuickTips) {
					Ext.QuickTips.ddDisable()
				}
				if (this.dragCurrent) {
					this.handleMouseUp(d)
				}
				this.currentTarget = d.getTarget();
				this.dragCurrent = c;
				var b = c.getEl();
				this.startX = d.getPageX();
				this.startY = d.getPageY();
				this.deltaX = this.startX - b.offsetLeft;
				this.deltaY = this.startY - b.offsetTop;
				this.dragThreshMet = false;
				this.clickTimeout = setTimeout(function () {
							var e = Ext.dd.DDM;
							e.startDrag(e.startX, e.startY)
						}, this.clickTimeThresh)
			},
			startDrag : function (b, c) {
				clearTimeout(this.clickTimeout);
				if (this.dragCurrent) {
					this.dragCurrent.b4StartDrag(b, c);
					this.dragCurrent.startDrag(b, c)
				}
				this.dragThreshMet = true
			},
			handleMouseUp : function (b) {
				if (Ext.QuickTips) {
					Ext.QuickTips.ddEnable()
				}
				if (!this.dragCurrent) {
					return
				}
				clearTimeout(this.clickTimeout);
				if (this.dragThreshMet) {
					this.fireEvents(b, true)
				} else {}
				
				this.stopDrag(b);
				this.stopEvent(b)
			},
			stopEvent : function (b) {
				if (this.stopPropagation) {
					b.stopPropagation()
				}
				if (this.preventDefault) {
					b.preventDefault()
				}
			},
			stopDrag : function (b) {
				if (this.dragCurrent) {
					if (this.dragThreshMet) {
						this.dragCurrent.b4EndDrag(b);
						this.dragCurrent.endDrag(b)
					}
					this.dragCurrent.onMouseUp(b)
				}
				this.dragCurrent = null;
				this.dragOvers = {}
				
			},
			handleMouseMove : function (d) {
				if (!this.dragCurrent) {
					return true
				}
				if (Ext.isIE && (d.button !== 0 && d.button !== 1 && d.button !== 2)) {
					this.stopEvent(d);
					return this.handleMouseUp(d)
				}
				if (!this.dragThreshMet) {
					var c = Math.abs(this.startX - d.getPageX());
					var b = Math.abs(this.startY - d.getPageY());
					if (c > this.clickPixelThresh || b > this.clickPixelThresh) {
						this.startDrag(this.startX, this.startY)
					}
				}
				if (this.dragThreshMet) {
					this.dragCurrent.b4Drag(d);
					this.dragCurrent.onDrag(d);
					if (!this.dragCurrent.moveOnly) {
						this.fireEvents(d, false)
					}
				}
				this.stopEvent(d);
				return true
			},
			fireEvents : function (n, o) {
				var q = this.dragCurrent;
				if (!q || q.isLocked()) {
					return
				}
				var r = n.getPoint();
				var b = [];
				var g = [];
				var l = [];
				var j = [];
				var d = [];
				for (var h in this.dragOvers) {
					var c = this.dragOvers[h];
					if (!this.isTypeOfDD(c)) {
						continue
					}
					if (!this.isOverTarget(r, c, this.mode)) {
						g.push(c)
					}
					b[h] = true;
					delete this.dragOvers[h]
				}
				for (var p in q.groups) {
					if ("string" != typeof p) {
						continue
					}
					for (h in this.ids[p]) {
						var k = this.ids[p][h];
						if (!this.isTypeOfDD(k)) {
							continue
						}
						if (k.isTarget && !k.isLocked() && ((k != q) || (q.ignoreSelf === false))) {
							if (this.isOverTarget(r, k, this.mode)) {
								if (o) {
									j.push(k)
								} else {
									if (!b[k.id]) {
										d.push(k)
									} else {
										l.push(k)
									}
									this.dragOvers[k.id] = k
								}
							}
						}
					}
				}
				if (this.mode) {
					if (g.length) {
						q.b4DragOut(n, g);
						q.onDragOut(n, g)
					}
					if (d.length) {
						q.onDragEnter(n, d)
					}
					if (l.length) {
						q.b4DragOver(n, l);
						q.onDragOver(n, l)
					}
					if (j.length) {
						q.b4DragDrop(n, j);
						q.onDragDrop(n, j)
					}
				} else {
					var m = 0;
					for (h = 0, m = g.length; h < m; ++h) {
						q.b4DragOut(n, g[h].id);
						q.onDragOut(n, g[h].id)
					}
					for (h = 0, m = d.length; h < m; ++h) {
						q.onDragEnter(n, d[h].id)
					}
					for (h = 0, m = l.length; h < m; ++h) {
						q.b4DragOver(n, l[h].id);
						q.onDragOver(n, l[h].id)
					}
					for (h = 0, m = j.length; h < m; ++h) {
						q.b4DragDrop(n, j[h].id);
						q.onDragDrop(n, j[h].id)
					}
				}
				if (o && !j.length) {
					q.onInvalidDrop(n)
				}
			},
			getBestMatch : function (d) {
				var g = null;
				var c = d.length;
				if (c == 1) {
					g = d[0]
				} else {
					for (var e = 0; e < c; ++e) {
						var b = d[e];
						if (b.cursorIsOver) {
							g = b;
							break
						} else {
							if (!g || g.overlap.getArea() < b.overlap.getArea()) {
								g = b
							}
						}
					}
				}
				return g
			},
			refreshCache : function (c) {
				for (var b in c) {
					if ("string" != typeof b) {
						continue
					}
					for (var d in this.ids[b]) {
						var e = this.ids[b][d];
						if (this.isTypeOfDD(e)) {
							var g = this.getLocation(e);
							if (g) {
								this.locationCache[e.id] = g
							} else {
								delete this.locationCache[e.id]
							}
						}
					}
				}
			},
			verifyEl : function (c) {
				if (c) {
					var b;
					if (Ext.isIE) {
						try {
							b = c.offsetParent
						} catch (d) {}
						
					} else {
						b = c.offsetParent
					}
					if (b) {
						return true
					}
				}
				return false
			},
			getLocation : function (j) {
				if (!this.isTypeOfDD(j)) {
					return null
				}
				var h = j.getEl(),
				o,
				g,
				d,
				q,
				p,
				s,
				c,
				n,
				i,
				m;
				try {
					o = Ext.lib.Dom.getXY(h)
				} catch (k) {}
				
				if (!o) {
					return null
				}
				g = o[0];
				d = g + h.offsetWidth;
				q = o[1];
				p = q + h.offsetHeight;
				s = q - j.padding[0];
				c = d + j.padding[1];
				n = p + j.padding[2];
				i = g - j.padding[3];
				m = new Ext.lib.Region(s, c, n, i);
				h = Ext.get(h.parentNode);
				while (h && m) {
					if (h.isScrollable()) {
						m = m.intersect(h.getRegion())
					}
					h = h.parent()
				}
				return m
			},
			isOverTarget : function (k, b, d) {
				var g = this.locationCache[b.id];
				if (!g || !this.useCache) {
					g = this.getLocation(b);
					this.locationCache[b.id] = g
				}
				if (!g) {
					return false
				}
				b.cursorIsOver = g.contains(k);
				var j = this.dragCurrent;
				if (!j || !j.getTargetCoord || (!d && !j.constrainX && !j.constrainY)) {
					return b.cursorIsOver
				}
				b.overlap = null;
				var h = j.getTargetCoord(k.x, k.y);
				var c = j.getDragEl();
				var e = new Ext.lib.Region(h.y, h.x + c.offsetWidth, h.y + c.offsetHeight, h.x);
				var i = e.intersect(g);
				if (i) {
					b.overlap = i;
					return (d) ? true : b.cursorIsOver
				} else {
					return false
				}
			},
			_onUnload : function (c, b) {
				a.removeListener(document, "mouseup", this.handleMouseUp, this);
				a.removeListener(document, "mousemove", this.handleMouseMove, this);
				a.removeListener(window, "resize", this._onResize, this);
				Ext.dd.DragDropMgr.unregAll()
			},
			unregAll : function () {
				if (this.dragCurrent) {
					this.stopDrag();
					this.dragCurrent = null
				}
				this._execOnAll("unreg", []);
				for (var b in this.elementCache) {
					delete this.elementCache[b]
				}
				this.elementCache = {};
				this.ids = {}
				
			},
			elementCache : {},
			getElWrapper : function (c) {
				var b = this.elementCache[c];
				if (!b || !b.el) {
					b = this.elementCache[c] = new this.ElementWrapper(Ext.getDom(c))
				}
				return b
			},
			getElement : function (b) {
				return Ext.getDom(b)
			},
			getCss : function (c) {
				var b = Ext.getDom(c);
				return (b) ? b.style : null
			},
			ElementWrapper : function (b) {
				this.el = b || null;
				this.id = this.el && b.id;
				this.css = this.el && b.style
			},
			getPosX : function (b) {
				return Ext.lib.Dom.getX(b)
			},
			getPosY : function (b) {
				return Ext.lib.Dom.getY(b)
			},
			swapNode : function (d, b) {
				if (d.swapNode) {
					d.swapNode(b)
				} else {
					var e = b.parentNode;
					var c = b.nextSibling;
					if (c == d) {
						e.insertBefore(d, b)
					} else {
						if (b == d.nextSibling) {
							e.insertBefore(b, d)
						} else {
							d.parentNode.replaceChild(b, d);
							e.insertBefore(d, c)
						}
					}
				}
			},
			getScroll : function () {
				var d,
				b,
				e = document.documentElement,
				c = document.body;
				if (e && (e.scrollTop || e.scrollLeft)) {
					d = e.scrollTop;
					b = e.scrollLeft
				} else {
					if (c) {
						d = c.scrollTop;
						b = c.scrollLeft
					} else {}
					
				}
				return {
					top : d,
					left : b
				}
			},
			getStyle : function (c, b) {
				return Ext.fly(c).getStyle(b)
			},
			getScrollTop : function () {
				return this.getScroll().top
			},
			getScrollLeft : function () {
				return this.getScroll().left
			},
			moveToEl : function (b, d) {
				var c = Ext.lib.Dom.getXY(d);
				Ext.lib.Dom.setXY(b, c)
			},
			numericSort : function (d, c) {
				return (d - c)
			},
			_timeoutCount : 0,
			_addListeners : function () {
				var b = Ext.dd.DDM;
				if (Ext.lib.Event && document) {
					b._onLoad()
				} else {
					if (b._timeoutCount > 2000) {}
					else {
						setTimeout(b._addListeners, 10);
						if (document && document.body) {
							b._timeoutCount += 1
						}
					}
				}
			},
			handleWasClicked : function (b, d) {
				if (this.isHandle(d, b.id)) {
					return true
				} else {
					var c = b.parentNode;
					while (c) {
						if (this.isHandle(d, c.id)) {
							return true
						} else {
							c = c.parentNode
						}
					}
				}
				return false
			}
		}
	}
	();
	Ext.dd.DDM = Ext.dd.DragDropMgr;
	Ext.dd.DDM._addListeners()
}
Ext.dd.DD = function (c, a, b) {
	if (c) {
		this.init(c, a, b)
	}
};
Ext.extend(Ext.dd.DD, Ext.dd.DragDrop, {
		scroll : true,
		autoOffset : function (c, b) {
			var a = c - this.startPageX;
			var d = b - this.startPageY;
			this.setDelta(a, d)
		},
		setDelta : function (b, a) {
			this.deltaX = b;
			this.deltaY = a
		},
		setDragElPos : function (c, b) {
			var a = this.getDragEl();
			this.alignElWithMouse(a, c, b)
		},
		alignElWithMouse : function (c, h, g) {
			var e = this.getTargetCoord(h, g);
			var b = c.dom ? c : Ext.fly(c, "_dd");
			if (!this.deltaSetXY) {
				var i = [e.x, e.y];
				b.setXY(i);
				var d = b.getLeft(true);
				var a = b.getTop(true);
				this.deltaSetXY = [d - e.x, a - e.y]
			} else {
				b.setLeftTop(e.x + this.deltaSetXY[0], e.y + this.deltaSetXY[1])
			}
			this.cachePosition(e.x, e.y);
			this.autoScroll(e.x, e.y, c.offsetHeight, c.offsetWidth);
			return e
		},
		cachePosition : function (b, a) {
			if (b) {
				this.lastPageX = b;
				this.lastPageY = a
			} else {
				var c = Ext.lib.Dom.getXY(this.getEl());
				this.lastPageX = c[0];
				this.lastPageY = c[1]
			}
		},
		autoScroll : function (l, k, e, m) {
			if (this.scroll) {
				var n = Ext.lib.Dom.getViewHeight();
				var b = Ext.lib.Dom.getViewWidth();
				var p = this.DDM.getScrollTop();
				var d = this.DDM.getScrollLeft();
				var j = e + k;
				var o = m + l;
				var i = (n + p - k - this.deltaY);
				var g = (b + d - l - this.deltaX);
				var c = 40;
				var a = (document.all) ? 80 : 30;
				if (j > n && i < c) {
					window.scrollTo(d, p + a)
				}
				if (k < p && p > 0 && k - p < c) {
					window.scrollTo(d, p - a)
				}
				if (o > b && g < c) {
					window.scrollTo(d + a, p)
				}
				if (l < d && d > 0 && l - d < c) {
					window.scrollTo(d - a, p)
				}
			}
		},
		getTargetCoord : function (c, b) {
			var a = c - this.deltaX;
			var d = b - this.deltaY;
			if (this.constrainX) {
				if (a < this.minX) {
					a = this.minX
				}
				if (a > this.maxX) {
					a = this.maxX
				}
			}
			if (this.constrainY) {
				if (d < this.minY) {
					d = this.minY
				}
				if (d > this.maxY) {
					d = this.maxY
				}
			}
			a = this.getTick(a, this.xTicks);
			d = this.getTick(d, this.yTicks);
			return {
				x : a,
				y : d
			}
		},
		applyConfig : function () {
			Ext.dd.DD.superclass.applyConfig.call(this);
			this.scroll = (this.config.scroll !== false)
		},
		b4MouseDown : function (a) {
			this.autoOffset(a.getPageX(), a.getPageY())
		},
		b4Drag : function (a) {
			this.setDragElPos(a.getPageX(), a.getPageY())
		},
		toString : function () {
			return ("DD " + this.id)
		}
	});
Ext.dd.DDProxy = function (c, a, b) {
	if (c) {
		this.init(c, a, b);
		this.initFrame()
	}
};
Ext.dd.DDProxy.dragElId = "ygddfdiv";
Ext.extend(Ext.dd.DDProxy, Ext.dd.DD, {
		resizeFrame : true,
		centerFrame : false,
		createFrame : function () {
			var b = this;
			var a = document.body;
			if (!a || !a.firstChild) {
				setTimeout(function () {
						b.createFrame()
					}, 50);
				return
			}
			var d = this.getDragEl();
			if (!d) {
				d = document.createElement("div");
				d.id = this.dragElId;
				var c = d.style;
				c.position = "absolute";
				c.visibility = "hidden";
				c.cursor = "move";
				c.border = "2px solid #aaa";
				c.zIndex = 999;
				a.insertBefore(d, a.firstChild)
			}
		},
		initFrame : function () {
			this.createFrame()
		},
		applyConfig : function () {
			Ext.dd.DDProxy.superclass.applyConfig.call(this);
			this.resizeFrame = (this.config.resizeFrame !== false);
			this.centerFrame = (this.config.centerFrame);
			this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId)
		},
		showFrame : function (e, d) {
			var c = this.getEl();
			var a = this.getDragEl();
			var b = a.style;
			this._resizeProxy();
			if (this.centerFrame) {
				this.setDelta(Math.round(parseInt(b.width, 10) / 2), Math.round(parseInt(b.height, 10) / 2))
			}
			this.setDragElPos(e, d);
			Ext.fly(a).show()
		},
		_resizeProxy : function () {
			if (this.resizeFrame) {
				var a = this.getEl();
				Ext.fly(this.getDragEl()).setSize(a.offsetWidth, a.offsetHeight)
			}
		},
		b4MouseDown : function (b) {
			var a = b.getPageX();
			var c = b.getPageY();
			this.autoOffset(a, c);
			this.setDragElPos(a, c)
		},
		b4StartDrag : function (a, b) {
			this.showFrame(a, b)
		},
		b4EndDrag : function (a) {
			Ext.fly(this.getDragEl()).hide()
		},
		endDrag : function (c) {
			var b = this.getEl();
			var a = this.getDragEl();
			a.style.visibility = "";
			this.beforeMove();
			b.style.visibility = "hidden";
			Ext.dd.DDM.moveToEl(b, a);
			a.style.visibility = "hidden";
			b.style.visibility = "";
			this.afterDrag()
		},
		beforeMove : function () {},
		afterDrag : function () {},
		toString : function () {
			return ("DDProxy " + this.id)
		}
	});
Ext.dd.DDTarget = function (c, a, b) {
	if (c) {
		this.initTarget(c, a, b)
	}
};
Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, {
		getDragEl : Ext.emptyFn,
		isValidHandleChild : Ext.emptyFn,
		startDrag : Ext.emptyFn,
		endDrag : Ext.emptyFn,
		onDrag : Ext.emptyFn,
		onDragDrop : Ext.emptyFn,
		onDragEnter : Ext.emptyFn,
		onDragOut : Ext.emptyFn,
		onDragOver : Ext.emptyFn,
		onInvalidDrop : Ext.emptyFn,
		onMouseDown : Ext.emptyFn,
		onMouseUp : Ext.emptyFn,
		setXConstraint : Ext.emptyFn,
		setYConstraint : Ext.emptyFn,
		resetConstraints : Ext.emptyFn,
		clearConstraints : Ext.emptyFn,
		clearTicks : Ext.emptyFn,
		setInitPosition : Ext.emptyFn,
		setDragElId : Ext.emptyFn,
		setHandleElId : Ext.emptyFn,
		setOuterHandleElId : Ext.emptyFn,
		addInvalidHandleClass : Ext.emptyFn,
		addInvalidHandleId : Ext.emptyFn,
		addInvalidHandleType : Ext.emptyFn,
		removeInvalidHandleClass : Ext.emptyFn,
		removeInvalidHandleId : Ext.emptyFn,
		removeInvalidHandleType : Ext.emptyFn,
		toString : function () {
			return ("DDTarget " + this.id)
		}
	});
Ext.dd.DragTracker = Ext.extend(Ext.util.Observable, {
			active : false,
			tolerance : 5,
			autoStart : false,
			constructor : function (a) {
				Ext.apply(this, a);
				this.addEvents("mousedown", "mouseup", "mousemove", "dragstart", "dragend", "drag");
				this.dragRegion = new Ext.lib.Region(0, 0, 0, 0);
				if (this.el) {
					this.initEl(this.el)
				}
				Ext.dd.DragTracker.superclass.constructor.call(this, a)
			},
			initEl : function (a) {
				this.el = Ext.get(a);
				a.on("mousedown", this.onMouseDown, this, this.delegate ? {
						delegate : this.delegate
					}
					 : undefined)
			},
			destroy : function () {
				this.el.un("mousedown", this.onMouseDown, this);
				delete this.el
			},
			onMouseDown : function (b, a) {
				if (this.fireEvent("mousedown", this, b) !== false && this.onBeforeStart(b) !== false) {
					this.startXY = this.lastXY = b.getXY();
					this.dragTarget = this.delegate ? a : this.el.dom;
					if (this.preventDefault !== false) {
						b.preventDefault()
					}
					Ext.getDoc().on({
							scope : this,
							mouseup : this.onMouseUp,
							mousemove : this.onMouseMove,
							selectstart : this.stopSelect
						});
					if (this.autoStart) {
						this.timer = this.triggerStart.defer(this.autoStart === true ? 1000 : this.autoStart, this, [b])
					}
				}
			},
			onMouseMove : function (d, c) {
				if (this.active && Ext.isIE && !d.browserEvent.button) {
					d.preventDefault();
					this.onMouseUp(d);
					return
				}
				d.preventDefault();
				var b = d.getXY(),
				a = this.startXY;
				this.lastXY = b;
				if (!this.active) {
					if (Math.abs(a[0] - b[0]) > this.tolerance || Math.abs(a[1] - b[1]) > this.tolerance) {
						this.triggerStart(d)
					} else {
						return
					}
				}
				this.fireEvent("mousemove", this, d);
				this.onDrag(d);
				this.fireEvent("drag", this, d)
			},
			onMouseUp : function (c) {
				var b = Ext.getDoc(),
				a = this.active;
				b.un("mousemove", this.onMouseMove, this);
				b.un("mouseup", this.onMouseUp, this);
				b.un("selectstart", this.stopSelect, this);
				c.preventDefault();
				this.clearStart();
				this.active = false;
				delete this.elRegion;
				this.fireEvent("mouseup", this, c);
				if (a) {
					this.onEnd(c);
					this.fireEvent("dragend", this, c)
				}
			},
			triggerStart : function (a) {
				this.clearStart();
				this.active = true;
				this.onStart(a);
				this.fireEvent("dragstart", this, a)
			},
			clearStart : function () {
				if (this.timer) {
					clearTimeout(this.timer);
					delete this.timer
				}
			},
			stopSelect : function (a) {
				a.stopEvent();
				return false
			},
			onBeforeStart : function (a) {},
			onStart : function (a) {},
			onDrag : function (a) {},
			onEnd : function (a) {},
			getDragTarget : function () {
				return this.dragTarget
			},
			getDragCt : function () {
				return this.el
			},
			getXY : function (a) {
				return a ? this.constrainModes[a].call(this, this.lastXY) : this.lastXY
			},
			getOffset : function (c) {
				var b = this.getXY(c),
				a = this.startXY;
				return [a[0] - b[0], a[1] - b[1]]
			},
			constrainModes : {
				point : function (b) {
					if (!this.elRegion) {
						this.elRegion = this.getDragCt().getRegion()
					}
					var a = this.dragRegion;
					a.left = b[0];
					a.top = b[1];
					a.right = b[0];
					a.bottom = b[1];
					a.constrainTo(this.elRegion);
					return [a.left, a.top]
				}
			}
		});
Ext.dd.ScrollManager = function () {
	var c = Ext.dd.DragDropMgr;
	var e = {};
	var b = null;
	var i = {};
	var h = function (l) {
		b = null;
		a()
	};
	var j = function () {
		if (c.dragCurrent) {
			c.refreshCache(c.dragCurrent.groups)
		}
	};
	var d = function () {
		if (c.dragCurrent) {
			var l = Ext.dd.ScrollManager;
			var m = i.el.ddScrollConfig ? i.el.ddScrollConfig.increment : l.increment;
			if (!l.animate) {
				if (i.el.scroll(i.dir, m)) {
					j()
				}
			} else {
				i.el.scroll(i.dir, m, true, l.animDuration, j)
			}
		}
	};
	var a = function () {
		if (i.id) {
			clearInterval(i.id)
		}
		i.id = 0;
		i.el = null;
		i.dir = ""
	};
	var g = function (m, l) {
		a();
		i.el = m;
		i.dir = l;
		var o = m.ddScrollConfig ? m.ddScrollConfig.ddGroup : undefined,
		n = (m.ddScrollConfig && m.ddScrollConfig.frequency) ? m.ddScrollConfig.frequency : Ext.dd.ScrollManager.frequency;
		if (o === undefined || c.dragCurrent.ddGroup == o) {
			i.id = setInterval(d, n)
		}
	};
	var k = function (o, q) {
		if (q || !c.dragCurrent) {
			return
		}
		var s = Ext.dd.ScrollManager;
		if (!b || b != c.dragCurrent) {
			b = c.dragCurrent;
			s.refreshCache()
		}
		var t = Ext.lib.Event.getXY(o);
		var u = new Ext.lib.Point(t[0], t[1]);
		for (var m in e) {
			var n = e[m],
			l = n._region;
			var p = n.ddScrollConfig ? n.ddScrollConfig : s;
			if (l && l.contains(u) && n.isScrollable()) {
				if (l.bottom - u.y <= p.vthresh) {
					if (i.el != n) {
						g(n, "down")
					}
					return
				} else {
					if (l.right - u.x <= p.hthresh) {
						if (i.el != n) {
							g(n, "left")
						}
						return
					} else {
						if (u.y - l.top <= p.vthresh) {
							if (i.el != n) {
								g(n, "up")
							}
							return
						} else {
							if (u.x - l.left <= p.hthresh) {
								if (i.el != n) {
									g(n, "right")
								}
								return
							}
						}
					}
				}
			}
		}
		a()
	};
	c.fireEvents = c.fireEvents.createSequence(k, c);
	c.stopDrag = c.stopDrag.createSequence(h, c);
	return {
		register : function (n) {
			if (Ext.isArray(n)) {
				for (var m = 0, l = n.length; m < l; m++) {
					this.register(n[m])
				}
			} else {
				n = Ext.get(n);
				e[n.id] = n
			}
		},
		unregister : function (n) {
			if (Ext.isArray(n)) {
				for (var m = 0, l = n.length; m < l; m++) {
					this.unregister(n[m])
				}
			} else {
				n = Ext.get(n);
				delete e[n.id]
			}
		},
		vthresh : 25,
		hthresh : 25,
		increment : 100,
		frequency : 500,
		animate : true,
		animDuration : 0.4,
		ddGroup : undefined,
		refreshCache : function () {
			for (var l in e) {
				if (typeof e[l] == "object") {
					e[l]._region = e[l].getRegion()
				}
			}
		}
	}
}
();
Ext.dd.Registry = function () {
	var d = {};
	var b = {};
	var a = 0;
	var c = function (g, e) {
		if (typeof g == "string") {
			return g
		}
		var h = g.id;
		if (!h && e !== false) {
			h = "extdd-" + (++a);
			g.id = h
		}
		return h
	};
	return {
		register : function (j, k) {
			k = k || {};
			if (typeof j == "string") {
				j = document.getElementById(j)
			}
			k.ddel = j;
			d[c(j)] = k;
			if (k.isHandle !== false) {
				b[k.ddel.id] = k
			}
			if (k.handles) {
				var h = k.handles;
				for (var g = 0, e = h.length; g < e; g++) {
					b[c(h[g])] = k
				}
			}
		},
		unregister : function (j) {
			var l = c(j, false);
			var k = d[l];
			if (k) {
				delete d[l];
				if (k.handles) {
					var h = k.handles;
					for (var g = 0, e = h.length; g < e; g++) {
						delete b[c(h[g], false)]
					}
				}
			}
		},
		getHandle : function (e) {
			if (typeof e != "string") {
				e = e.id
			}
			return b[e]
		},
		getHandleFromEvent : function (h) {
			var g = Ext.lib.Event.getTarget(h);
			return g ? b[g.id] : null
		},
		getTarget : function (e) {
			if (typeof e != "string") {
				e = e.id
			}
			return d[e]
		},
		getTargetFromEvent : function (h) {
			var g = Ext.lib.Event.getTarget(h);
			return g ? d[g.id] || b[g.id] : null
		}
	}
}
();
Ext.dd.StatusProxy = function (a) {
	Ext.apply(this, a);
	this.id = this.id || Ext.id();
	this.el = new Ext.Layer({
				dh : {
					id : this.id,
					tag : "div",
					cls : "x-dd-drag-proxy " + this.dropNotAllowed,
					children : [{
							tag : "div",
							cls : "x-dd-drop-icon"
						}, {
							tag : "div",
							cls : "x-dd-drag-ghost"
						}
					]
				},
				shadow : !a || a.shadow !== false
			});
	this.ghost = Ext.get(this.el.dom.childNodes[1]);
	this.dropStatus = this.dropNotAllowed
};
Ext.dd.StatusProxy.prototype = {
	dropAllowed : "x-dd-drop-ok",
	dropNotAllowed : "x-dd-drop-nodrop",
	setStatus : function (a) {
		a = a || this.dropNotAllowed;
		if (this.dropStatus != a) {
			this.el.replaceClass(this.dropStatus, a);
			this.dropStatus = a
		}
	},
	reset : function (a) {
		this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed;
		this.dropStatus = this.dropNotAllowed;
		if (a) {
			this.ghost.update("")
		}
	},
	update : function (a) {
		if (typeof a == "string") {
			this.ghost.update(a)
		} else {
			this.ghost.update("");
			a.style.margin = "0";
			this.ghost.dom.appendChild(a)
		}
		var b = this.ghost.dom.firstChild;
		if (b) {
			Ext.fly(b).setStyle("float", "none")
		}
	},
	getEl : function () {
		return this.el
	},
	getGhost : function () {
		return this.ghost
	},
	hide : function (a) {
		this.el.hide();
		if (a) {
			this.reset(true)
		}
	},
	stop : function () {
		if (this.anim && this.anim.isAnimated && this.anim.isAnimated()) {
			this.anim.stop()
		}
	},
	show : function () {
		this.el.show()
	},
	sync : function () {
		this.el.sync()
	},
	repair : function (b, c, a) {
		this.callback = c;
		this.scope = a;
		if (b && this.animRepair !== false) {
			this.el.addClass("x-dd-drag-repair");
			this.el.hideUnders(true);
			this.anim = this.el.shift({
						duration : this.repairDuration || 0.5,
						easing : "easeOut",
						xy : b,
						stopFx : true,
						callback : this.afterRepair,
						scope : this
					})
		} else {
			this.afterRepair()
		}
	},
	afterRepair : function () {
		this.hide(true);
		if (typeof this.callback == "function") {
			this.callback.call(this.scope || this)
		}
		this.callback = null;
		this.scope = null
	},
	destroy : function () {
		Ext.destroy(this.ghost, this.el)
	}
};
Ext.dd.DragSource = function (b, a) {
	this.el = Ext.get(b);
	if (!this.dragData) {
		this.dragData = {}
		
	}
	Ext.apply(this, a);
	if (!this.proxy) {
		this.proxy = new Ext.dd.StatusProxy()
	}
	Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, {
			dragElId : this.proxy.id,
			resizeFrame : false,
			isTarget : false,
			scroll : this.scroll === true
		});
	this.dragging = false
};
Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, {
		dropAllowed : "x-dd-drop-ok",
		dropNotAllowed : "x-dd-drop-nodrop",
		getDragData : function (a) {
			return this.dragData
		},
		onDragEnter : function (c, d) {
			var b = Ext.dd.DragDropMgr.getDDById(d);
			this.cachedTarget = b;
			if (this.beforeDragEnter(b, c, d) !== false) {
				if (b.isNotifyTarget) {
					var a = b.notifyEnter(this, c, this.dragData);
					this.proxy.setStatus(a)
				} else {
					this.proxy.setStatus(this.dropAllowed)
				}
				if (this.afterDragEnter) {
					this.afterDragEnter(b, c, d)
				}
			}
		},
		beforeDragEnter : function (b, a, c) {
			return true
		},
		alignElWithMouse : function () {
			Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments);
			this.proxy.sync()
		},
		onDragOver : function (c, d) {
			var b = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(d);
			if (this.beforeDragOver(b, c, d) !== false) {
				if (b.isNotifyTarget) {
					var a = b.notifyOver(this, c, this.dragData);
					this.proxy.setStatus(a)
				}
				if (this.afterDragOver) {
					this.afterDragOver(b, c, d)
				}
			}
		},
		beforeDragOver : function (b, a, c) {
			return true
		},
		onDragOut : function (b, c) {
			var a = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(c);
			if (this.beforeDragOut(a, b, c) !== false) {
				if (a.isNotifyTarget) {
					a.notifyOut(this, b, this.dragData)
				}
				this.proxy.reset();
				if (this.afterDragOut) {
					this.afterDragOut(a, b, c)
				}
			}
			this.cachedTarget = null
		},
		beforeDragOut : function (b, a, c) {
			return true
		},
		onDragDrop : function (b, c) {
			var a = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(c);
			if (this.beforeDragDrop(a, b, c) !== false) {
				if (a.isNotifyTarget) {
					if (a.notifyDrop(this, b, this.dragData)) {
						this.onValidDrop(a, b, c)
					} else {
						this.onInvalidDrop(a, b, c)
					}
				} else {
					this.onValidDrop(a, b, c)
				}
				if (this.afterDragDrop) {
					this.afterDragDrop(a, b, c)
				}
			}
			delete this.cachedTarget
		},
		beforeDragDrop : function (b, a, c) {
			return true
		},
		onValidDrop : function (b, a, c) {
			this.hideProxy();
			if (this.afterValidDrop) {
				this.afterValidDrop(b, a, c)
			}
		},
		getRepairXY : function (b, a) {
			return this.el.getXY()
		},
		onInvalidDrop : function (b, a, c) {
			this.beforeInvalidDrop(b, a, c);
			if (this.cachedTarget) {
				if (this.cachedTarget.isNotifyTarget) {
					this.cachedTarget.notifyOut(this, a, this.dragData)
				}
				this.cacheTarget = null
			}
			this.proxy.repair(this.getRepairXY(a, this.dragData), this.afterRepair, this);
			if (this.afterInvalidDrop) {
				this.afterInvalidDrop(a, c)
			}
		},
		afterRepair : function () {
			if (Ext.enableFx) {
				this.el.highlight(this.hlColor || "c3daf9")
			}
			this.dragging = false
		},
		beforeInvalidDrop : function (b, a, c) {
			return true
		},
		handleMouseDown : function (b) {
			if (this.dragging) {
				return
			}
			var a = this.getDragData(b);
			if (a && this.onBeforeDrag(a, b) !== false) {
				this.dragData = a;
				this.proxy.stop();
				Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments)
			}
		},
		onBeforeDrag : function (a, b) {
			return true
		},
		onStartDrag : Ext.emptyFn,
		startDrag : function (a, b) {
			this.proxy.reset();
			this.dragging = true;
			this.proxy.update("");
			this.onInitDrag(a, b);
			this.proxy.show()
		},
		onInitDrag : function (a, c) {
			var b = this.el.dom.cloneNode(true);
			b.id = Ext.id();
			this.proxy.update(b);
			this.onStartDrag(a, c);
			return true
		},
		getProxy : function () {
			return this.proxy
		},
		hideProxy : function () {
			this.proxy.hide();
			this.proxy.reset(true);
			this.dragging = false
		},
		triggerCacheRefresh : function () {
			Ext.dd.DDM.refreshCache(this.groups)
		},
		b4EndDrag : function (a) {},
		endDrag : function (a) {
			this.onEndDrag(this.dragData, a)
		},
		onEndDrag : function (a, b) {},
		autoOffset : function (a, b) {
			this.setDelta(-12, -20)
		},
		destroy : function () {
			Ext.dd.DragSource.superclass.destroy.call(this);
			Ext.destroy(this.proxy)
		}
	});
Ext.dd.DropTarget = Ext.extend(Ext.dd.DDTarget, {
			constructor : function (b, a) {
				this.el = Ext.get(b);
				Ext.apply(this, a);
				if (this.containerScroll) {
					Ext.dd.ScrollManager.register(this.el)
				}
				Ext.dd.DropTarget.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, {
						isTarget : true
					})
			},
			dropAllowed : "x-dd-drop-ok",
			dropNotAllowed : "x-dd-drop-nodrop",
			isTarget : true,
			isNotifyTarget : true,
			notifyEnter : function (a, c, b) {
				if (this.overClass) {
					this.el.addClass(this.overClass)
				}
				return this.dropAllowed
			},
			notifyOver : function (a, c, b) {
				return this.dropAllowed
			},
			notifyOut : function (a, c, b) {
				if (this.overClass) {
					this.el.removeClass(this.overClass)
				}
			},
			notifyDrop : function (a, c, b) {
				return false
			},
			destroy : function () {
				Ext.dd.DropTarget.superclass.destroy.call(this);
				if (this.containerScroll) {
					Ext.dd.ScrollManager.unregister(this.el)
				}
			}
		});
Ext.dd.DragZone = Ext.extend(Ext.dd.DragSource, {
			constructor : function (b, a) {
				Ext.dd.DragZone.superclass.constructor.call(this, b, a);
				if (this.containerScroll) {
					Ext.dd.ScrollManager.register(this.el)
				}
			},
			getDragData : function (a) {
				return Ext.dd.Registry.getHandleFromEvent(a)
			},
			onInitDrag : function (a, b) {
				this.proxy.update(this.dragData.ddel.cloneNode(true));
				this.onStartDrag(a, b);
				return true
			},
			afterRepair : function () {
				if (Ext.enableFx) {
					Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9")
				}
				this.dragging = false
			},
			getRepairXY : function (a) {
				return Ext.Element.fly(this.dragData.ddel).getXY()
			},
			destroy : function () {
				Ext.dd.DragZone.superclass.destroy.call(this);
				if (this.containerScroll) {
					Ext.dd.ScrollManager.unregister(this.el)
				}
			}
		});
Ext.dd.DropZone = function (b, a) {
	Ext.dd.DropZone.superclass.constructor.call(this, b, a)
};
Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, {
		getTargetFromEvent : function (a) {
			return Ext.dd.Registry.getTargetFromEvent(a)
		},
		onNodeEnter : function (d, a, c, b) {},
		onNodeOver : function (d, a, c, b) {
			return this.dropAllowed
		},
		onNodeOut : function (d, a, c, b) {},
		onNodeDrop : function (d, a, c, b) {
			return false
		},
		onContainerOver : function (a, c, b) {
			return this.dropNotAllowed
		},
		onContainerDrop : function (a, c, b) {
			return false
		},
		notifyEnter : function (a, c, b) {
			return this.dropNotAllowed
		},
		notifyOver : function (a, c, b) {
			var d = this.getTargetFromEvent(c);
			if (!d) {
				if (this.lastOverNode) {
					this.onNodeOut(this.lastOverNode, a, c, b);
					this.lastOverNode = null
				}
				return this.onContainerOver(a, c, b)
			}
			if (this.lastOverNode != d) {
				if (this.lastOverNode) {
					this.onNodeOut(this.lastOverNode, a, c, b)
				}
				this.onNodeEnter(d, a, c, b);
				this.lastOverNode = d
			}
			return this.onNodeOver(d, a, c, b)
		},
		notifyOut : function (a, c, b) {
			if (this.lastOverNode) {
				this.onNodeOut(this.lastOverNode, a, c, b);
				this.lastOverNode = null
			}
		},
		notifyDrop : function (a, c, b) {
			if (this.lastOverNode) {
				this.onNodeOut(this.lastOverNode, a, c, b);
				this.lastOverNode = null
			}
			var d = this.getTargetFromEvent(c);
			return d ? this.onNodeDrop(d, a, c, b) : this.onContainerDrop(a, c, b)
		},
		triggerCacheRefresh : function () {
			Ext.dd.DDM.refreshCache(this.groups)
		}
	});
Ext.Element.addMethods({
		initDD : function (c, b, d) {
			var a = new Ext.dd.DD(Ext.id(this.dom), c, b);
			return Ext.apply(a, d)
		},
		initDDProxy : function (c, b, d) {
			var a = new Ext.dd.DDProxy(Ext.id(this.dom), c, b);
			return Ext.apply(a, d)
		},
		initDDTarget : function (c, b, d) {
			var a = new Ext.dd.DDTarget(Ext.id(this.dom), c, b);
			return Ext.apply(a, d)
		}
	});
Ext.data.Api = (function () {
		var a = {};
		return {
			actions : {
				create : "create",
				read : "read",
				update : "update",
				destroy : "destroy"
			},
			restActions : {
				create : "POST",
				read : "GET",
				update : "PUT",
				destroy : "DELETE"
			},
			isAction : function (b) {
				return (Ext.data.Api.actions[b]) ? true : false
			},
			getVerb : function (b) {
				if (a[b]) {
					return a[b]
				}
				for (var c in this.actions) {
					if (this.actions[c] === b) {
						a[b] = c;
						break
					}
				}
				return (a[b] !== undefined) ? a[b] : null
			},
			isValid : function (b) {
				var e = [];
				var d = this.actions;
				for (var c in b) {
					if (!(c in d)) {
						e.push(c)
					}
				}
				return (!e.length) ? true : e
			},
			hasUniqueUrl : function (c, g) {
				var b = (c.api[g]) ? c.api[g].url : null;
				var e = true;
				for (var d in c.api) {
					if ((e = (d === g) ? true : (c.api[d].url != b) ? true : false) === false) {
						break
					}
				}
				return e
			},
			prepare : function (b) {
				if (!b.api) {
					b.api = {}
					
				}
				for (var d in this.actions) {
					var c = this.actions[d];
					b.api[c] = b.api[c] || b.url || b.directFn;
					if (typeof(b.api[c]) == "string") {
						b.api[c] = {
							url : b.api[c],
							method : (b.restful === true) ? Ext.data.Api.restActions[c] : undefined
						}
					}
				}
			},
			restify : function (b) {
				b.restful = true;
				for (var c in this.restActions) {
					b.api[this.actions[c]].method || (b.api[this.actions[c]].method = this.restActions[c])
				}
				b.onWrite = b.onWrite.createInterceptor(function (i, j, g, e) {
							var d = j.reader;
							var h = new Ext.data.Response({
										action : i,
										raw : g
									});
							switch (g.status) {
							case 200:
								return true;
								break;
							case 201:
								if (Ext.isEmpty(h.raw.responseText)) {
									h.success = true
								} else {
									return true
								}
								break;
							case 204:
								h.success = true;
								h.data = null;
								break;
							default:
								return true;
								break
							}
							if (h.success === true) {
								this.fireEvent("write", this, i, h.data, h, e, j.request.arg)
							} else {
								this.fireEvent("exception", this, "remote", i, j, h, e)
							}
							j.request.callback.call(j.request.scope, h.data, h, h.success);
							return false
						}, b)
			}
		}
	})();
Ext.data.Response = function (b, a) {
	Ext.apply(this, b, {
			raw : a
		})
};
Ext.data.Response.prototype = {
	message : null,
	success : false,
	status : null,
	root : null,
	raw : null,
	getMessage : function () {
		return this.message
	},
	getSuccess : function () {
		return this.success
	},
	getStatus : function () {
		return this.status
	},
	getRoot : function () {
		return this.root
	},
	getRawResponse : function () {
		return this.raw
	}
};
Ext.data.Api.Error = Ext.extend(Ext.Error, {
			constructor : function (b, a) {
				this.arg = a;
				Ext.Error.call(this, b)
			},
			name : "Ext.data.Api"
		});
Ext.apply(Ext.data.Api.Error.prototype, {
		lang : {
			"action-url-undefined" : "No fallback url defined for this action.  When defining a DataProxy api, please be sure to define an url for each CRUD action in Ext.data.Api.actions or define a default url in addition to your api-configuration.",
			invalid : "received an invalid API-configuration.  Please ensure your proxy API-configuration contains only the actions defined in Ext.data.Api.actions",
			"invalid-url" : "Invalid url.  Please review your proxy configuration.",
			execute : 'Attempted to execute an unknown action.  Valid API actions are defined in Ext.data.Api.actions"'
		}
	});
Ext.data.SortTypes = {
	none : function (a) {
		return a
	},
	stripTagsRE : /<\/?[^>]+>/gi,
	asText : function (a) {
		return String(a).replace(this.stripTagsRE, "")
	},
	asUCText : function (a) {
		return String(a).toUpperCase().replace(this.stripTagsRE, "")
	},
	asUCString : function (a) {
		return String(a).toUpperCase()
	},
	asDate : function (a) {
		if (!a) {
			return 0
		}
		if (Ext.isDate(a)) {
			return a.getTime()
		}
		return Date.parse(String(a))
	},
	asFloat : function (a) {
		var b = parseFloat(String(a).replace(/,/g, ""));
		return isNaN(b) ? 0 : b
	},
	asInt : function (a) {
		var b = parseInt(String(a).replace(/,/g, ""), 10);
		return isNaN(b) ? 0 : b
	}
};
Ext.data.Record = function (a, b) {
	this.id = (b || b === 0) ? b : Ext.data.Record.id(this);
	this.data = a || {}
		
};
Ext.data.Record.create = function (e) {
	var c = Ext.extend(Ext.data.Record, {});
	var d = c.prototype;
	d.fields = new Ext.util.MixedCollection(false, function (g) {
				return g.name
			});
	for (var b = 0, a = e.length; b < a; b++) {
		d.fields.add(new Ext.data.Field(e[b]))
	}
	c.getField = function (g) {
		return d.fields.get(g)
	};
	return c
};
Ext.data.Record.PREFIX = "ext-record";
Ext.data.Record.AUTO_ID = 1;
Ext.data.Record.EDIT = "edit";
Ext.data.Record.REJECT = "reject";
Ext.data.Record.COMMIT = "commit";
Ext.data.Record.id = function (a) {
	a.phantom = true;
	return [Ext.data.Record.PREFIX, "-", Ext.data.Record.AUTO_ID++].join("")
};
Ext.data.Record.prototype = {
	dirty : false,
	editing : false,
	error : null,
	modified : null,
	phantom : false,
	join : function (a) {
		this.store = a
	},
	set : function (a, c) {
		var b = Ext.isPrimitive(c) ? String : Ext.encode;
		if (b(this.data[a]) == b(c)) {
			return
		}
		this.dirty = true;
		if (!this.modified) {
			this.modified = {}
			
		}
		if (this.modified[a] === undefined) {
			this.modified[a] = this.data[a]
		}
		this.data[a] = c;
		if (!this.editing) {
			this.afterEdit()
		}
	},
	afterEdit : function () {
		if (this.store != undefined && typeof this.store.afterEdit == "function") {
			this.store.afterEdit(this)
		}
	},
	afterReject : function () {
		if (this.store) {
			this.store.afterReject(this)
		}
	},
	afterCommit : function () {
		if (this.store) {
			this.store.afterCommit(this)
		}
	},
	get : function (a) {
		return this.data[a]
	},
	beginEdit : function () {
		this.editing = true;
		this.modified = this.modified || {}
			
	},
	cancelEdit : function () {
		this.editing = false;
		delete this.modified
	},
	endEdit : function () {
		this.editing = false;
		if (this.dirty) {
			this.afterEdit()
		}
	},
	reject : function (b) {
		var a = this.modified;
		for (var c in a) {
			if (typeof a[c] != "function") {
				this.data[c] = a[c]
			}
		}
		this.dirty = false;
		delete this.modified;
		this.editing = false;
		if (b !== true) {
			this.afterReject()
		}
	},
	commit : function (a) {
		this.dirty = false;
		delete this.modified;
		this.editing = false;
		if (a !== true) {
			this.afterCommit()
		}
	},
	getChanges : function () {
		var a = this.modified,
		b = {};
		for (var c in a) {
			if (a.hasOwnProperty(c)) {
				b[c] = this.data[c]
			}
		}
		return b
	},
	hasError : function () {
		return this.error !== null
	},
	clearError : function () {
		this.error = null
	},
	copy : function (a) {
		return new this.constructor(Ext.apply({}, this.data), a || this.id)
	},
	isModified : function (a) {
		return !!(this.modified && this.modified.hasOwnProperty(a))
	},
	isValid : function () {
		return this.fields.find(function (a) {
				return (a.allowBlank === false && Ext.isEmpty(this.data[a.name])) ? true : false
			}, this) ? false : true
	},
	markDirty : function () {
		this.dirty = true;
		if (!this.modified) {
			this.modified = {}
			
		}
		this.fields.each(function (a) {
				this.modified[a.name] = this.data[a.name]
			}, this)
	}
};
Ext.StoreMgr = Ext.apply(new Ext.util.MixedCollection(), {
			register : function () {
				for (var a = 0, b; (b = arguments[a]); a++) {
					this.add(b)
				}
			},
			unregister : function () {
				for (var a = 0, b; (b = arguments[a]); a++) {
					this.remove(this.lookup(b))
				}
			},
			lookup : function (e) {
				if (Ext.isArray(e)) {
					var b = ["field1"],
					d = !Ext.isArray(e[0]);
					if (!d) {
						for (var c = 2, a = e[0].length; c <= a; ++c) {
							b.push("field" + c)
						}
					}
					return new Ext.data.ArrayStore({
							fields : b,
							data : e,
							expandData : d,
							autoDestroy : true,
							autoCreated : true
						})
				}
				return Ext.isObject(e) ? (e.events ? e : Ext.create(e, "store")) : this.get(e)
			},
			getKey : function (a) {
				return a.storeId
			}
		});
Ext.data.Store = Ext.extend(Ext.util.Observable, {
			writer : undefined,
			remoteSort : false,
			autoDestroy : false,
			pruneModifiedRecords : false,
			lastOptions : null,
			autoSave : true,
			batch : true,
			restful : false,
			paramNames : undefined,
			defaultParamNames : {
				start : "start",
				limit : "limit",
				sort : "sort",
				dir : "dir"
			},
			isDestroyed : false,
			hasMultiSort : false,
			batchKey : "_ext_batch_",
			constructor : function (a) {
				this.data = new Ext.util.MixedCollection(false);
				this.data.getKey = function (b) {
					return b.id
				};
				this.removed = [];
				if (a && a.data) {
					this.inlineData = a.data;
					delete a.data
				}
				Ext.apply(this, a);
				this.baseParams = Ext.isObject(this.baseParams) ? this.baseParams : {};
				this.paramNames = Ext.applyIf(this.paramNames || {}, this.defaultParamNames);
				if ((this.url || this.api) && !this.proxy) {
					this.proxy = new Ext.data.HttpProxy({
								url : this.url,
								api : this.api
							})
				}
				if (this.restful === true && this.proxy) {
					this.batch = false;
					Ext.data.Api.restify(this.proxy)
				}
				if (this.reader) {
					if (!this.recordType) {
						this.recordType = this.reader.recordType
					}
					if (this.reader.onMetaChange) {
						this.reader.onMetaChange = this.reader.onMetaChange.createSequence(this.onMetaChange, this)
					}
					if (this.writer) {
						if (this.writer instanceof(Ext.data.DataWriter) === false) {
							this.writer = this.buildWriter(this.writer)
						}
						this.writer.meta = this.reader.meta;
						this.pruneModifiedRecords = true
					}
				}
				if (this.recordType) {
					this.fields = this.recordType.prototype.fields
				}
				this.modified = [];
				this.addEvents("datachanged", "metachange", "add", "remove", "update", "clear", "exception", "beforeload", "load", "loadexception", "beforewrite", "write", "beforesave", "save");
				if (this.proxy) {
					this.relayEvents(this.proxy, ["loadexception", "exception"])
				}
				if (this.writer) {
					this.on({
							scope : this,
							add : this.createRecords,
							remove : this.destroyRecord,
							update : this.updateRecord,
							clear : this.onClear
						})
				}
				this.sortToggle = {};
				if (this.sortField) {
					this.setDefaultSort(this.sortField, this.sortDir)
				} else {
					if (this.sortInfo) {
						this.setDefaultSort(this.sortInfo.field, this.sortInfo.direction)
					}
				}
				Ext.data.Store.superclass.constructor.call(this);
				if (this.id) {
					this.storeId = this.id;
					delete this.id
				}
				if (this.storeId) {
					Ext.StoreMgr.register(this)
				}
				if (this.inlineData) {
					this.loadData(this.inlineData);
					delete this.inlineData
				} else {
					if (this.autoLoad) {
						this.load.defer(10, this, [typeof this.autoLoad == "object" ? this.autoLoad : undefined])
					}
				}
				this.batchCounter = 0;
				this.batches = {}
				
			},
			buildWriter : function (b) {
				var a = undefined,
				c = (b.format || "json").toLowerCase();
				switch (c) {
				case "json":
					a = Ext.data.JsonWriter;
					break;
				case "xml":
					a = Ext.data.XmlWriter;
					break;
				default:
					a = Ext.data.JsonWriter
				}
				return new a(b)
			},
			destroy : function () {
				if (!this.isDestroyed) {
					if (this.storeId) {
						Ext.StoreMgr.unregister(this)
					}
					this.clearData();
					this.data = null;
					Ext.destroy(this.proxy);
					this.reader = this.writer = null;
					this.purgeListeners();
					this.isDestroyed = true
				}
			},
			add : function (c) {
				var e,
				a,
				b,
				d;
				c = [].concat(c);
				if (c.length < 1) {
					return
				}
				for (e = 0, a = c.length; e < a; e++) {
					b = c[e];
					b.join(this);
					if (b.dirty || b.phantom) {
						this.modified.push(b)
					}
				}
				d = this.data.length;
				this.data.addAll(c);
				if (this.snapshot) {
					this.snapshot.addAll(c)
				}
				this.fireEvent("add", this, c, d)
			},
			addSorted : function (a) {
				var b = this.findInsertIndex(a);
				this.insert(b, a)
			},
			doUpdate : function (a) {
				var b = a.id;
				this.getById(b).join(null);
				this.data.replace(b, a);
				if (this.snapshot) {
					this.snapshot.replace(b, a)
				}
				a.join(this);
				this.fireEvent("update", this, a, Ext.data.Record.COMMIT)
			},
			remove : function (a) {
				if (Ext.isArray(a)) {
					Ext.each(a, function (c) {
							this.remove(c)
						}, this);
					return
				}
				var b = this.data.indexOf(a);
				if (b > -1) {
					a.join(null);
					this.data.removeAt(b)
				}
				if (this.pruneModifiedRecords) {
					this.modified.remove(a)
				}
				if (this.snapshot) {
					this.snapshot.remove(a)
				}
				if (b > -1) {
					this.fireEvent("remove", this, a, b)
				}
			},
			removeAt : function (a) {
				this.remove(this.getAt(a))
			},
			removeAll : function (b) {
				var a = [];
				this.each(function (c) {
						a.push(c)
					});
				this.clearData();
				if (this.snapshot) {
					this.snapshot.clear()
				}
				if (this.pruneModifiedRecords) {
					this.modified = []
				}
				if (b !== true) {
					this.fireEvent("clear", this, a)
				}
			},
			onClear : function (b, a) {
				Ext.each(a, function (d, c) {
						this.destroyRecord(this, d, c)
					}, this)
			},
			insert : function (d, c) {
				var e,
				a,
				b;
				c = [].concat(c);
				for (e = 0, a = c.length; e < a; e++) {
					b = c[e];
					this.data.insert(d + e, b);
					b.join(this);
					if (b.dirty || b.phantom) {
						this.modified.push(b)
					}
				}
				if (this.snapshot) {
					this.snapshot.addAll(c)
				}
				this.fireEvent("add", this, c, d)
			},
			indexOf : function (a) {
				return this.data.indexOf(a)
			},
			indexOfId : function (a) {
				return this.data.indexOfKey(a)
			},
			getById : function (a) {
				return (this.snapshot || this.data).key(a)
			},
			getAt : function (a) {
				return this.data.itemAt(a)
			},
			getRange : function (b, a) {
				return this.data.getRange(b, a)
			},
			storeOptions : function (a) {
				a = Ext.apply({}, a);
				delete a.callback;
				delete a.scope;
				this.lastOptions = a
			},
			clearData : function () {
				this.data.each(function (a) {
						a.join(null)
					});
				this.data.clear()
			},
			load : function (b) {
				b = Ext.apply({}, b);
				this.storeOptions(b);
				if (this.sortInfo && this.remoteSort) {
					var a = this.paramNames;
					b.params = Ext.apply({}, b.params);
					b.params[a.sort] = this.sortInfo.field;
					b.params[a.dir] = this.sortInfo.direction
				}
				try {
					return this.execute("read", null, b)
				} catch (c) {
					this.handleException(c);
					return false
				}
			},
			updateRecord : function (b, a, c) {
				if (c == Ext.data.Record.EDIT && this.autoSave === true && (!a.phantom || (a.phantom && a.isValid()))) {
					this.save()
				}
			},
			createRecords : function (c, b, e) {
				var d = this.modified,
				h = b.length,
				a,
				g;
				for (g = 0; g < h; g++) {
					a = b[g];
					if (a.phantom && a.isValid()) {
						a.markDirty();
						if (d.indexOf(a) == -1) {
							d.push(a)
						}
					}
				}
				if (this.autoSave === true) {
					this.save()
				}
			},
			destroyRecord : function (b, a, c) {
				if (this.modified.indexOf(a) != -1) {
					this.modified.remove(a)
				}
				if (!a.phantom) {
					this.removed.push(a);
					a.lastIndex = c;
					if (this.autoSave === true) {
						this.save()
					}
				}
			},
			execute : function (e, a, c, b) {
				if (!Ext.data.Api.isAction(e)) {
					throw new Ext.data.Api.Error("execute", e)
				}
				c = Ext.applyIf(c || {}, {
							params : {}
							
						});
				if (b !== undefined) {
					this.addToBatch(b)
				}
				var d = true;
				if (e === "read") {
					d = this.fireEvent("beforeload", this, c);
					Ext.applyIf(c.params, this.baseParams)
				} else {
					if (this.writer.listful === true && this.restful !== true) {
						a = (Ext.isArray(a)) ? a : [a]
					} else {
						if (Ext.isArray(a) && a.length == 1) {
							a = a.shift()
						}
					}
					if ((d = this.fireEvent("beforewrite", this, e, a, c)) !== false) {
						this.writer.apply(c.params, this.baseParams, e, a)
					}
				}
				if (d !== false) {
					if (this.writer && this.proxy.url && !this.proxy.restful && !Ext.data.Api.hasUniqueUrl(this.proxy, e)) {
						c.params.xaction = e
					}
					this.proxy.request(Ext.data.Api.actions[e], a, c.params, this.reader, this.createCallback(e, a, b), this, c)
				}
				return d
			},
			save : function () {
				if (!this.writer) {
					throw new Ext.data.Store.Error("writer-undefined")
				}
				var h = [],
				j,
				k,
				e,
				c = {},
				d;
				if (this.removed.length) {
					h.push(["destroy", this.removed])
				}
				var b = [].concat(this.getModifiedRecords());
				if (b.length) {
					var g = [];
					for (d = b.length - 1; d >= 0; d--) {
						if (b[d].phantom === true) {
							var a = b.splice(d, 1).shift();
							if (a.isValid()) {
								g.push(a)
							}
						} else {
							if (!b[d].isValid()) {
								b.splice(d, 1)
							}
						}
					}
					if (g.length) {
						h.push(["create", g])
					}
					if (b.length) {
						h.push(["update", b])
					}
				}
				j = h.length;
				if (j) {
					e = ++this.batchCounter;
					for (d = 0; d < j; ++d) {
						k = h[d];
						c[k[0]] = k[1]
					}
					if (this.fireEvent("beforesave", this, c) !== false) {
						for (d = 0; d < j; ++d) {
							k = h[d];
							this.doTransaction(k[0], k[1], e)
						}
						return e
					}
				}
				return -1
			},
			doTransaction : function (e, b, c) {
				function g(h) {
					try {
						this.execute(e, h, undefined, c)
					} catch (i) {
						this.handleException(i)
					}
				}
				if (this.batch === false) {
					for (var d = 0, a = b.length; d < a; d++) {
						g.call(this, b[d])
					}
				} else {
					g.call(this, b)
				}
			},
			addToBatch : function (c) {
				var a = this.batches,
				d = this.batchKey + c,
				e = a[d];
				if (!e) {
					a[d] = e = {
							id : c,
							count : 0,
							data : {}
							
						}
				}
				++e.count
			},
			removeFromBatch : function (d, h, g) {
				var c = this.batches,
				e = this.batchKey + d,
				i = c[e],
				a;
				if (i) {
					a = i.data[h] || [];
					i.data[h] = a.concat(g);
					if (i.count === 1) {
						g = i.data;
						delete c[e];
						this.fireEvent("save", this, d, g)
					} else {
						--i.count
					}
				}
			},
			createCallback : function (c, a, b) {
				var d = Ext.data.Api.actions;
				return (c == "read") ? this.loadRecords : function (g, e, h) {
					this["on" + Ext.util.Format.capitalize(c) + "Records"](h, a, [].concat(g));
					if (h === true) {
						this.fireEvent("write", this, c, g, e, a)
					}
					this.removeFromBatch(b, c, g)
				}
			},
			clearModified : function (a) {
				if (Ext.isArray(a)) {
					for (var b = a.length - 1; b >= 0; b--) {
						this.modified.splice(this.modified.indexOf(a[b]), 1)
					}
				} else {
					this.modified.splice(this.modified.indexOf(a), 1)
				}
			},
			reMap : function (b) {
				if (Ext.isArray(b)) {
					for (var d = 0, a = b.length; d < a; d++) {
						this.reMap(b[d])
					}
				} else {
					delete this.data.map[b._phid];
					this.data.map[b.id] = b;
					var c = this.data.keys.indexOf(b._phid);
					this.data.keys.splice(c, 1, b.id);
					delete b._phid
				}
			},
			onCreateRecords : function (d, a, b) {
				if (d === true) {
					try {
						this.reader.realize(a, b)
					} catch (c) {
						this.handleException(c);
						if (Ext.isArray(a)) {
							this.onCreateRecords(d, a, b)
						}
					}
				}
			},
			onUpdateRecords : function (d, a, b) {
				if (d === true) {
					try {
						this.reader.update(a, b)
					} catch (c) {
						this.handleException(c);
						if (Ext.isArray(a)) {
							this.onUpdateRecords(d, a, b)
						}
					}
				}
			},
			onDestroyRecords : function (e, b, d) {
				b = (b instanceof Ext.data.Record) ? [b] : [].concat(b);
				for (var c = 0, a = b.length; c < a; c++) {
					this.removed.splice(this.removed.indexOf(b[c]), 1)
				}
				if (e === false) {
					for (c = b.length - 1; c >= 0; c--) {
						this.insert(b[c].lastIndex, b[c])
					}
				}
			},
			handleException : function (a) {
				Ext.handleError(a)
			},
			reload : function (a) {
				this.load(Ext.applyIf(a || {}, this.lastOptions))
			},
			loadRecords : function (b, l, h) {
				var e,
				g;
				if (this.isDestroyed === true) {
					return
				}
				if (!b || h === false) {
					if (h !== false) {
						this.fireEvent("load", this, [], l)
					}
					if (l.callback) {
						l.callback.call(l.scope || this, [], l, false, b)
					}
					return
				}
				var a = b.records,
				j = b.totalRecords || a.length;
				if (!l || l.add !== true) {
					if (this.pruneModifiedRecords) {
						this.modified = []
					}
					for (e = 0, g = a.length; e < g; e++) {
						a[e].join(this)
					}
					if (this.snapshot) {
						this.data = this.snapshot;
						delete this.snapshot
					}
					this.clearData();
					this.data.addAll(a);
					this.totalLength = j;
					this.applySort();
					this.fireEvent("datachanged", this)
				} else {
					var k = [],
					d,
					c = 0;
					for (e = 0, g = a.length; e < g; ++e) {
						d = a[e];
						if (this.indexOfId(d.id) > -1) {
							this.doUpdate(d)
						} else {
							k.push(d);
							++c
						}
					}
					this.totalLength = Math.max(j, this.data.length + c);
					this.add(k)
				}
				this.fireEvent("load", this, a, l);
				if (l.callback) {
					l.callback.call(l.scope || this, a, l, true)
				}
			},
			loadData : function (c, a) {
				var b = this.reader.readRecords(c);
				this.loadRecords(b, {
						add : a
					}, true)
			},
			getCount : function () {
				return this.data.length || 0
			},
			getTotalCount : function () {
				return this.totalLength || 0
			},
			getSortState : function () {
				return this.sortInfo
			},
			applySort : function () {
				if ((this.sortInfo || this.multiSortInfo) && !this.remoteSort) {
					this.sortData()
				}
			},
			sortData : function () {
				var a = this.hasMultiSort ? this.multiSortInfo : this.sortInfo,
				k = a.direction || "ASC",
				h = a.sorters,
				c = [];
				if (!this.hasMultiSort) {
					h = [{
							direction : k,
							field : a.field
						}
					]
				}
				for (var d = 0, b = h.length; d < b; d++) {
					c.push(this.createSortFunction(h[d].field, h[d].direction))
				}
				if (c.length == 0) {
					return
				}
				var g = k.toUpperCase() == "DESC" ? -1 : 1;
				var e = function (n, m) {
					var l = c[0].call(this, n, m);
					if (c.length > 1) {
						for (var p = 1, o = c.length; p < o; p++) {
							l = l || c[p].call(this, n, m)
						}
					}
					return g * l
				};
				this.data.sort(k, e);
				if (this.snapshot && this.snapshot != this.data) {
					this.snapshot.sort(k, e)
				}
			},
			createSortFunction : function (c, b) {
				b = b || "ASC";
				var a = b.toUpperCase() == "DESC" ? -1 : 1;
				var d = this.fields.get(c).sortType;
				return function (g, e) {
					var i = d(g.data[c]),
					h = d(e.data[c]);
					return a * (i > h ? 1 : (i < h ? -1 : 0))
				}
			},
			setDefaultSort : function (b, a) {
				a = a ? a.toUpperCase() : "ASC";
				this.sortInfo = {
					field : b,
					direction : a
				};
				this.sortToggle[b] = a
			},
			sort : function (b, a) {
				if (Ext.isArray(arguments[0])) {
					return this.multiSort.call(this, b, a)
				} else {
					return this.singleSort(b, a)
				}
			},
			singleSort : function (g, c) {
				var e = this.fields.get(g);
				if (!e) {
					return false
				}
				var b = e.name,
				a = this.sortInfo || null,
				d = this.sortToggle ? this.sortToggle[b] : null;
				if (!c) {
					if (a && a.field == b) {
						c = (this.sortToggle[b] || "ASC").toggle("ASC", "DESC")
					} else {
						c = e.sortDir
					}
				}
				this.sortToggle[b] = c;
				this.sortInfo = {
					field : b,
					direction : c
				};
				this.hasMultiSort = false;
				if (this.remoteSort) {
					if (!this.load(this.lastOptions)) {
						if (d) {
							this.sortToggle[b] = d
						}
						if (a) {
							this.sortInfo = a
						}
					}
				} else {
					this.applySort();
					this.fireEvent("datachanged", this)
				}
				return true
			},
			multiSort : function (b, a) {
				this.hasMultiSort = true;
				a = a || "ASC";
				if (this.multiSortInfo && a == this.multiSortInfo.direction) {
					a = a.toggle("ASC", "DESC")
				}
				this.multiSortInfo = {
					sorters : b,
					direction : a
				};
				if (this.remoteSort) {
					this.singleSort(b[0].field, b[0].direction)
				} else {
					this.applySort();
					this.fireEvent("datachanged", this)
				}
			},
			each : function (b, a) {
				this.data.each(b, a)
			},
			getModifiedRecords : function () {
				return this.modified
			},
			sum : function (e, g, a) {
				var c = this.data.items,
				b = 0;
				g = g || 0;
				a = (a || a === 0) ? a : c.length - 1;
				for (var d = g; d <= a; d++) {
					b += (c[d].data[e] || 0)
				}
				return b
			},
			createFilterFn : function (d, c, e, a, b) {
				if (Ext.isEmpty(c, false)) {
					return false
				}
				c = this.data.createValueMatcher(c, e, a, b);
				return function (g) {
					return c.test(g.data[d])
				}
			},
			createMultipleFilterFn : function (a) {
				return function (b) {
					var k = true;
					for (var d = 0, c = a.length; d < c; d++) {
						var h = a[d],
						g = h.fn,
						e = h.scope;
						k = k && g.call(e, b)
					}
					return k
				}
			},
			filter : function (n, m, h, k, e) {
				var l;
				if (Ext.isObject(n)) {
					n = [n]
				}
				if (Ext.isArray(n)) {
					var b = [];
					for (var g = 0, d = n.length; g < d; g++) {
						var a = n[g],
						c = a.fn,
						o = a.scope || this;
						if (!Ext.isFunction(c)) {
							c = this.createFilterFn(a.property, a.value, a.anyMatch, a.caseSensitive, a.exactMatch)
						}
						b.push({
								fn : c,
								scope : o
							})
					}
					l = this.createMultipleFilterFn(b)
				} else {
					l = this.createFilterFn(n, m, h, k, e)
				}
				return l ? this.filterBy(l) : this.clearFilter()
			},
			filterBy : function (b, a) {
				this.snapshot = this.snapshot || this.data;
				this.data = this.queryBy(b, a || this);
				this.fireEvent("datachanged", this)
			},
			clearFilter : function (a) {
				if (this.isFiltered()) {
					this.data = this.snapshot;
					delete this.snapshot;
					if (a !== true) {
						this.fireEvent("datachanged", this)
					}
				}
			},
			isFiltered : function () {
				return !!this.snapshot && this.snapshot != this.data
			},
			query : function (d, c, e, a) {
				var b = this.createFilterFn(d, c, e, a);
				return b ? this.queryBy(b) : this.data.clone()
			},
			queryBy : function (b, a) {
				var c = this.snapshot || this.data;
				return c.filterBy(b, a || this)
			},
			find : function (d, c, g, e, a) {
				var b = this.createFilterFn(d, c, e, a);
				return b ? this.data.findIndexBy(b, null, g) : -1
			},
			findExact : function (b, a, c) {
				return this.data.findIndexBy(function (d) {
						return d.get(b) === a
					}, this, c)
			},
			findBy : function (b, a, c) {
				return this.data.findIndexBy(b, a, c)
			},
			collect : function (j, k, b) {
				var h = (b === true && this.snapshot) ? this.snapshot.items : this.data.items;
				var m,
				n,
				a = [],
				c = {};
				for (var e = 0, g = h.length; e < g; e++) {
					m = h[e].data[j];
					n = String(m);
					if ((k || !Ext.isEmpty(m)) && !c[n]) {
						c[n] = true;
						a[a.length] = m
					}
				}
				return a
			},
			afterEdit : function (a) {
				if (this.modified.indexOf(a) == -1) {
					this.modified.push(a)
				}
				this.fireEvent("update", this, a, Ext.data.Record.EDIT)
			},
			afterReject : function (a) {
				this.modified.remove(a);
				this.fireEvent("update", this, a, Ext.data.Record.REJECT)
			},
			afterCommit : function (a) {
				this.modified.remove(a);
				this.fireEvent("update", this, a, Ext.data.Record.COMMIT)
			},
			commitChanges : function () {
				var a = this.modified.slice(0),
				c = a.length,
				b;
				for (b = 0; b < c; b++) {
					a[b].commit()
				}
				this.modified = [];
				this.removed = []
			},
			rejectChanges : function () {
				var a = this.modified.slice(0),
				e = this.removed.slice(0).reverse(),
				c = a.length,
				d = e.length,
				b;
				for (b = 0; b < c; b++) {
					a[b].reject()
				}
				for (b = 0; b < d; b++) {
					this.insert(e[b].lastIndex || 0, e[b]);
					e[b].reject()
				}
				this.modified = [];
				this.removed = []
			},
			onMetaChange : function (a) {
				this.recordType = this.reader.recordType;
				this.fields = this.recordType.prototype.fields;
				delete this.snapshot;
				if (this.reader.meta.sortInfo) {
					this.sortInfo = this.reader.meta.sortInfo
				} else {
					if (this.sortInfo && !this.fields.get(this.sortInfo.field)) {
						delete this.sortInfo
					}
				}
				if (this.writer) {
					this.writer.meta = this.reader.meta
				}
				this.modified = [];
				this.fireEvent("metachange", this, this.reader.meta)
			},
			findInsertIndex : function (a) {
				this.suspendEvents();
				var c = this.data.clone();
				this.data.add(a);
				this.applySort();
				var b = this.data.indexOf(a);
				this.data = c;
				this.resumeEvents();
				return b
			},
			setBaseParam : function (a, b) {
				this.baseParams = this.baseParams || {};
				this.baseParams[a] = b
			}
		});
Ext.reg("store", Ext.data.Store);
Ext.data.Store.Error = Ext.extend(Ext.Error, {
			name : "Ext.data.Store"
		});
Ext.apply(Ext.data.Store.Error.prototype, {
		lang : {
			"writer-undefined" : "Attempted to execute a write-action without a DataWriter installed."
		}
	});
Ext.data.Field = Ext.extend(Object, {
			constructor : function (b) {
				if (Ext.isString(b)) {
					b = {
						name : b
					}
				}
				Ext.apply(this, b);
				var d = Ext.data.Types,
				a = this.sortType,
				c;
				if (this.type) {
					if (Ext.isString(this.type)) {
						this.type = Ext.data.Types[this.type.toUpperCase()] || d.AUTO
					}
				} else {
					this.type = d.AUTO
				}
				if (Ext.isString(a)) {
					this.sortType = Ext.data.SortTypes[a]
				} else {
					if (Ext.isEmpty(a)) {
						this.sortType = this.type.sortType
					}
				}
				if (!this.convert) {
					this.convert = this.type.convert
				}
			},
			dateFormat : null,
			useNull : false,
			defaultValue : "",
			mapping : null,
			sortType : null,
			sortDir : "ASC",
			allowBlank : true
		});
Ext.data.DataReader = function (a, b) {
	this.meta = a;
	this.recordType = Ext.isArray(b) ? Ext.data.Record.create(b) : b;
	if (this.recordType) {
		this.buildExtractors()
	}
};
Ext.data.DataReader.prototype = {
	getTotal : Ext.emptyFn,
	getRoot : Ext.emptyFn,
	getMessage : Ext.emptyFn,
	getSuccess : Ext.emptyFn,
	getId : Ext.emptyFn,
	buildExtractors : Ext.emptyFn,
	extractValues : Ext.emptyFn,
	realize : function (a, c) {
		if (Ext.isArray(a)) {
			for (var b = a.length - 1; b >= 0; b--) {
				if (Ext.isArray(c)) {
					this.realize(a.splice(b, 1).shift(), c.splice(b, 1).shift())
				} else {
					this.realize(a.splice(b, 1).shift(), c)
				}
			}
		} else {
			if (Ext.isArray(c) && c.length == 1) {
				c = c.shift()
			}
			if (!this.isData(c)) {
				throw new Ext.data.DataReader.Error("realize", a)
			}
			a.phantom = false;
			a._phid = a.id;
			a.id = this.getId(c);
			a.data = c;
			a.commit();
			a.store.reMap(a)
		}
	},
	update : function (a, c) {
		if (Ext.isArray(a)) {
			for (var b = a.length - 1; b >= 0; b--) {
				if (Ext.isArray(c)) {
					this.update(a.splice(b, 1).shift(), c.splice(b, 1).shift())
				} else {
					this.update(a.splice(b, 1).shift(), c)
				}
			}
		} else {
			if (Ext.isArray(c) && c.length == 1) {
				c = c.shift()
			}
			if (this.isData(c)) {
				a.data = Ext.apply(a.data, c)
			}
			a.commit()
		}
	},
	extractData : function (k, a) {
		var j = (this instanceof Ext.data.JsonReader) ? "json" : "node";
		var c = [];
		if (this.isData(k) && !(this instanceof Ext.data.XmlReader)) {
			k = [k]
		}
		var h = this.recordType.prototype.fields,
		o = h.items,
		m = h.length,
		c = [];
		if (a === true) {
			var l = this.recordType;
			for (var e = 0; e < k.length; e++) {
				var b = k[e];
				var g = new l(this.extractValues(b, o, m), this.getId(b));
				g[j] = b;
				c.push(g)
			}
		} else {
			for (var e = 0; e < k.length; e++) {
				var d = this.extractValues(k[e], o, m);
				d[this.meta.idProperty] = this.getId(k[e]);
				c.push(d)
			}
		}
		return c
	},
	isData : function (a) {
		return (a && Ext.isObject(a) && !Ext.isEmpty(this.getId(a))) ? true : false
	},
	onMetaChange : function (a) {
		delete this.ef;
		this.meta = a;
		this.recordType = Ext.data.Record.create(a.fields);
		this.buildExtractors()
	}
};
Ext.data.DataReader.Error = Ext.extend(Ext.Error, {
			constructor : function (b, a) {
				this.arg = a;
				Ext.Error.call(this, b)
			},
			name : "Ext.data.DataReader"
		});
Ext.apply(Ext.data.DataReader.Error.prototype, {
		lang : {
			update : "#update received invalid data from server.  Please see docs for DataReader#update and review your DataReader configuration.",
			realize : "#realize was called with invalid remote-data.  Please see the docs for DataReader#realize and review your DataReader configuration.",
			"invalid-response" : "#readResponse received an invalid response from the server."
		}
	});
Ext.data.DataWriter = function (a) {
	Ext.apply(this, a)
};
Ext.data.DataWriter.prototype = {
	writeAllFields : false,
	listful : false,
	apply : function (e, g, d, a) {
		var c = [],
		b = d + "Record";
		if (Ext.isArray(a)) {
			Ext.each(a, function (h) {
					c.push(this[b](h))
				}, this)
		} else {
			if (a instanceof Ext.data.Record) {
				c = this[b](a)
			}
		}
		this.render(e, g, c)
	},
	render : Ext.emptyFn,
	updateRecord : Ext.emptyFn,
	createRecord : Ext.emptyFn,
	destroyRecord : Ext.emptyFn,
	toHash : function (g, c) {
		var e = g.fields.map,
		d = {},
		b = (this.writeAllFields === false && g.phantom === false) ? g.getChanges() : g.data,
		a;
		Ext.iterate(b, function (i, h) {
				if ((a = e[i])) {
					d[a.mapping ? a.mapping : a.name] = h
				}
			});
		if (g.phantom) {
			if (g.fields.containsKey(this.meta.idProperty) && Ext.isEmpty(g.data[this.meta.idProperty])) {
				delete d[this.meta.idProperty]
			}
		} else {
			d[this.meta.idProperty] = g.id
		}
		return d
	},
	toArray : function (b) {
		var a = [];
		Ext.iterate(b, function (d, c) {
				a.push({
						name : d,
						value : c
					})
			}, this);
		return a
	}
};
Ext.data.DataProxy = function (a) {
	a = a || {};
	this.api = a.api;
	this.url = a.url;
	this.restful = a.restful;
	this.listeners = a.listeners;
	this.prettyUrls = a.prettyUrls;
	this.addEvents("exception", "beforeload", "load", "loadexception", "beforewrite", "write");
	Ext.data.DataProxy.superclass.constructor.call(this);
	try {
		Ext.data.Api.prepare(this)
	} catch (b) {
		if (b instanceof Ext.data.Api.Error) {
			b.toConsole()
		}
	}
	Ext.data.DataProxy.relayEvents(this, ["beforewrite", "write", "exception"])
};
Ext.extend(Ext.data.DataProxy, Ext.util.Observable, {
		restful : false,
		setApi : function () {
			if (arguments.length == 1) {
				var a = Ext.data.Api.isValid(arguments[0]);
				if (a === true) {
					this.api = arguments[0]
				} else {
					throw new Ext.data.Api.Error("invalid", a)
				}
			} else {
				if (arguments.length == 2) {
					if (!Ext.data.Api.isAction(arguments[0])) {
						throw new Ext.data.Api.Error("invalid", arguments[0])
					}
					this.api[arguments[0]] = arguments[1]
				}
			}
			Ext.data.Api.prepare(this)
		},
		isApiAction : function (a) {
			return (this.api[a]) ? true : false
		},
		request : function (e, b, g, a, h, d, c) {
			if (!this.api[e] && !this.load) {
				throw new Ext.data.DataProxy.Error("action-undefined", e)
			}
			g = g || {};
			if ((e === Ext.data.Api.actions.read) ? this.fireEvent("beforeload", this, g) : this.fireEvent("beforewrite", this, e, b, g) !== false) {
				this.doRequest.apply(this, arguments)
			} else {
				h.call(d || this, null, c, false)
			}
		},
		load : null,
		doRequest : function (e, b, g, a, h, d, c) {
			this.load(g, a, h, d, c)
		},
		onRead : Ext.emptyFn,
		onWrite : Ext.emptyFn,
		buildUrl : function (d, b) {
			b = b || null;
			var c = (this.conn && this.conn.url) ? this.conn.url : (this.api[d]) ? this.api[d].url : this.url;
			if (!c) {
				throw new Ext.data.Api.Error("invalid-url", d)
			}
			var e = null;
			var a = c.match(/(.*)(\.json|\.xml|\.html)$/);
			if (a) {
				e = a[2];
				c = a[1]
			}
			if ((this.restful === true || this.prettyUrls === true) && b instanceof Ext.data.Record && !b.phantom) {
				c += "/" + b.id
			}
			return (e === null) ? c : c + e
		},
		destroy : function () {
			this.purgeListeners()
		}
	});
Ext.apply(Ext.data.DataProxy, Ext.util.Observable.prototype);
Ext.util.Observable.call(Ext.data.DataProxy);
Ext.data.DataProxy.Error = Ext.extend(Ext.Error, {
			constructor : function (b, a) {
				this.arg = a;
				Ext.Error.call(this, b)
			},
			name : "Ext.data.DataProxy"
		});
Ext.apply(Ext.data.DataProxy.Error.prototype, {
		lang : {
			"action-undefined" : "DataProxy attempted to execute an API-action but found an undefined url / function.  Please review your Proxy url/api-configuration.",
			"api-invalid" : "Recieved an invalid API-configuration.  Please ensure your proxy API-configuration contains only the actions from Ext.data.Api.actions."
		}
	});
Ext.data.Request = function (a) {
	Ext.apply(this, a)
};
Ext.data.Request.prototype = {
	action : undefined,
	rs : undefined,
	params : undefined,
	callback : Ext.emptyFn,
	scope : undefined,
	reader : undefined
};
Ext.data.Response = function (a) {
	Ext.apply(this, a)
};
Ext.data.Response.prototype = {
	action : undefined,
	success : undefined,
	message : undefined,
	data : undefined,
	raw : undefined,
	records : undefined
};
Ext.data.ScriptTagProxy = function (a) {
	Ext.apply(this, a);
	Ext.data.ScriptTagProxy.superclass.constructor.call(this, a);
	this.head = document.getElementsByTagName("head")[0]
};
Ext.data.ScriptTagProxy.TRANS_ID = 1000;
Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, {
		timeout : 30000,
		callbackParam : "callback",
		nocache : true,
		doRequest : function (e, g, d, h, j, k, l) {
			var c = Ext.urlEncode(Ext.apply(d, this.extraParams));
			var b = this.buildUrl(e, g);
			if (!b) {
				throw new Ext.data.Api.Error("invalid-url", b)
			}
			b = Ext.urlAppend(b, c);
			if (this.nocache) {
				b = Ext.urlAppend(b, "_dc=" + (new Date().getTime()))
			}
			var a = ++Ext.data.ScriptTagProxy.TRANS_ID;
			var m = {
				id : a,
				action : e,
				cb : "stcCallback" + a,
				scriptId : "stcScript" + a,
				params : d,
				arg : l,
				url : b,
				callback : j,
				scope : k,
				reader : h
			};
			window[m.cb] = this.createCallback(e, g, m);
			b += String.format("&{0}={1}", this.callbackParam, m.cb);
			if (this.autoAbort !== false) {
				this.abort()
			}
			m.timeoutId = this.handleFailure.defer(this.timeout, this, [m]);
			var i = document.createElement("script");
			i.setAttribute("src", b);
			i.setAttribute("type", "text/javascript");
			i.setAttribute("id", m.scriptId);
			this.head.appendChild(i);
			this.trans = m
		},
		createCallback : function (d, b, c) {
			var a = this;
			return function (e) {
				a.trans = false;
				a.destroyTrans(c, true);
				if (d === Ext.data.Api.actions.read) {
					a.onRead.call(a, d, c, e)
				} else {
					a.onWrite.call(a, d, c, e, b)
				}
			}
		},
		onRead : function (d, c, b) {
			var a;
			try {
				a = c.reader.readRecords(b)
			} catch (g) {
				this.fireEvent("loadexception", this, c, b, g);
				this.fireEvent("exception", this, "response", d, c, b, g);
				c.callback.call(c.scope || window, null, c.arg, false);
				return
			}
			if (a.success === false) {
				this.fireEvent("loadexception", this, c, b);
				this.fireEvent("exception", this, "remote", d, c, b, null)
			} else {
				this.fireEvent("load", this, b, c.arg)
			}
			c.callback.call(c.scope || window, a, c.arg, a.success)
		},
		onWrite : function (h, g, c, b) {
			var a = g.reader;
			try {
				var d = a.readResponse(h, c)
			} catch (i) {
				this.fireEvent("exception", this, "response", h, g, d, i);
				g.callback.call(g.scope || window, null, d, false);
				return
			}
			if (!d.success === true) {
				this.fireEvent("exception", this, "remote", h, g, d, b);
				g.callback.call(g.scope || window, null, d, false);
				return
			}
			this.fireEvent("write", this, h, d.data, d, b, g.arg);
			g.callback.call(g.scope || window, d.data, d, true)
		},
		isLoading : function () {
			return this.trans ? true : false
		},
		abort : function () {
			if (this.isLoading()) {
				this.destroyTrans(this.trans)
			}
		},
		destroyTrans : function (b, a) {
			this.head.removeChild(document.getElementById(b.scriptId));
			clearTimeout(b.timeoutId);
			if (a) {
				window[b.cb] = undefined;
				try {
					delete window[b.cb]
				} catch (c) {}
				
			} else {
				window[b.cb] = function () {
					window[b.cb] = undefined;
					try {
						delete window[b.cb]
					} catch (d) {}
					
				}
			}
		},
		handleFailure : function (a) {
			this.trans = false;
			this.destroyTrans(a, false);
			if (a.action === Ext.data.Api.actions.read) {
				this.fireEvent("loadexception", this, null, a.arg)
			}
			this.fireEvent("exception", this, "response", a.action, {
					response : null,
					options : a.arg
				});
			a.callback.call(a.scope || window, null, a.arg, false)
		},
		destroy : function () {
			this.abort();
			Ext.data.ScriptTagProxy.superclass.destroy.call(this)
		}
	});
Ext.data.HttpProxy = function (a) {
	Ext.data.HttpProxy.superclass.constructor.call(this, a);
	this.conn = a;
	this.conn.url = null;
	this.useAjax = !a || !a.events;
	var c = Ext.data.Api.actions;
	this.activeRequest = {};
	for (var b in c) {
		this.activeRequest[c[b]] = undefined
	}
};
Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, {
		getConnection : function () {
			return this.useAjax ? Ext.Ajax : this.conn
		},
		setUrl : function (a, b) {
			this.conn.url = a;
			if (b === true) {
				this.url = a;
				this.api = null;
				Ext.data.Api.prepare(this)
			}
		},
		doRequest : function (g, d, i, c, b, e, a) {
			var h = {
				method : (this.api[g]) ? this.api[g]["method"] : undefined,
				request : {
					callback : b,
					scope : e,
					arg : a
				},
				reader : c,
				callback : this.createCallback(g, d),
				scope : this
			};
			if (i.jsonData) {
				h.jsonData = i.jsonData
			} else {
				if (i.xmlData) {
					h.xmlData = i.xmlData
				} else {
					h.params = i || {}
						
				}
			}
			this.conn.url = this.buildUrl(g, d);
			if (this.useAjax) {
				Ext.applyIf(h, this.conn);
				if (this.activeRequest[g]) {}
				
				this.activeRequest[g] = Ext.Ajax.request(h)
			} else {
				this.conn.request(h)
			}
			this.conn.url = null
		},
		createCallback : function (b, a) {
			return function (e, d, c) {
				this.activeRequest[b] = undefined;
				if (!d) {
					if (b === Ext.data.Api.actions.read) {
						this.fireEvent("loadexception", this, e, c)
					}
					this.fireEvent("exception", this, "response", b, e, c);
					e.request.callback.call(e.request.scope, null, e.request.arg, false);
					return
				}
				if (b === Ext.data.Api.actions.read) {
					this.onRead(b, e, c)
				} else {
					this.onWrite(b, e, c, a)
				}
			}
		},
		onRead : function (d, h, b) {
			var a;
			try {
				a = h.reader.read(b)
			} catch (g) {
				this.fireEvent("loadexception", this, h, b, g);
				this.fireEvent("exception", this, "response", d, h, b, g);
				h.request.callback.call(h.request.scope, null, h.request.arg, false);
				return
			}
			if (a.success === false) {
				this.fireEvent("loadexception", this, h, b);
				var c = h.reader.readResponse(d, b);
				this.fireEvent("exception", this, "remote", d, h, c, null)
			} else {
				this.fireEvent("load", this, h, h.request.arg)
			}
			h.request.callback.call(h.request.scope, a, h.request.arg, a.success)
		},
		onWrite : function (g, i, c, b) {
			var a = i.reader;
			var d;
			try {
				d = a.readResponse(g, c)
			} catch (h) {
				this.fireEvent("exception", this, "response", g, i, c, h);
				i.request.callback.call(i.request.scope, null, i.request.arg, false);
				return
			}
			if (d.success === true) {
				this.fireEvent("write", this, g, d.data, d, b, i.request.arg)
			} else {
				this.fireEvent("exception", this, "remote", g, i, d, b)
			}
			i.request.callback.call(i.request.scope, d.data, d, d.success)
		},
		destroy : function () {
			if (!this.useAjax) {
				this.conn.abort()
			} else {
				if (this.activeRequest) {
					var b = Ext.data.Api.actions;
					for (var a in b) {
						if (this.activeRequest[b[a]]) {
							Ext.Ajax.abort(this.activeRequest[b[a]])
						}
					}
				}
			}
			Ext.data.HttpProxy.superclass.destroy.call(this)
		}
	});
Ext.data.MemoryProxy = function (b) {
	var a = {};
	a[Ext.data.Api.actions.read] = true;
	Ext.data.MemoryProxy.superclass.constructor.call(this, {
			api : a
		});
	this.data = b
};
Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, {
		doRequest : function (b, c, a, d, h, i, j) {
			a = a || {};
			var k;
			try {
				k = d.readRecords(this.data)
			} catch (g) {
				this.fireEvent("loadexception", this, null, j, g);
				this.fireEvent("exception", this, "response", b, j, null, g);
				h.call(i, null, j, false);
				return
			}
			h.call(i, k, j, true)
		}
	});
Ext.data.Types = new function () {
	var a = Ext.data.SortTypes;
	Ext.apply(this, {
			stripRe : /[\$,%]/g,
			AUTO : {
				convert : function (b) {
					return b
				},
				sortType : a.none,
				type : "auto"
			},
			STRING : {
				convert : function (b) {
					return (b === undefined || b === null) ? "" : String(b)
				},
				sortType : a.asUCString,
				type : "string"
			},
			INT : {
				convert : function (b) {
					return b !== undefined && b !== null && b !== "" ? parseInt(String(b).replace(Ext.data.Types.stripRe, ""), 10) : (this.useNull ? null : 0)
				},
				sortType : a.none,
				type : "int"
			},
			FLOAT : {
				convert : function (b) {
					return b !== undefined && b !== null && b !== "" ? parseFloat(String(b).replace(Ext.data.Types.stripRe, ""), 10) : (this.useNull ? null : 0)
				},
				sortType : a.none,
				type : "float"
			},
			BOOL : {
				convert : function (b) {
					return b === true || b === "true" || b == 1
				},
				sortType : a.none,
				type : "bool"
			},
			DATE : {
				convert : function (c) {
					var d = this.dateFormat;
					if (!c) {
						return null
					}
					if (Ext.isDate(c)) {
						return c
					}
					if (d) {
						if (d == "timestamp") {
							return new Date(c * 1000)
						}
						if (d == "time") {
							return new Date(parseInt(c, 10))
						}
						return Date.parseDate(c, d)
					}
					var b = Date.parse(c);
					return b ? new Date(b) : null
				},
				sortType : a.asDate,
				type : "date"
			}
		});
	Ext.apply(this, {
			BOOLEAN : this.BOOL,
			INTEGER : this.INT,
			NUMBER : this.FLOAT
		})
};
Ext.data.JsonWriter = Ext.extend(Ext.data.DataWriter, {
			encode : true,
			encodeDelete : false,
			constructor : function (a) {
				Ext.data.JsonWriter.superclass.constructor.call(this, a)
			},
			render : function (c, d, b) {
				if (this.encode === true) {
					Ext.apply(c, d);
					c[this.meta.root] = Ext.encode(b)
				} else {
					var a = Ext.apply({}, d);
					a[this.meta.root] = b;
					c.jsonData = a
				}
			},
			createRecord : function (a) {
				return this.toHash(a)
			},
			updateRecord : function (a) {
				return this.toHash(a)
			},
			destroyRecord : function (b) {
				if (this.encodeDelete) {
					var a = {};
					a[this.meta.idProperty] = b.id;
					return a
				} else {
					return b.id
				}
			}
		});
Ext.data.JsonReader = function (a, b) {
	a = a || {};
	Ext.applyIf(a, {
			idProperty : "id",
			successProperty : "success",
			totalProperty : "total"
		});
	Ext.data.JsonReader.superclass.constructor.call(this, a, b || a.fields)
};
Ext.extend(Ext.data.JsonReader, Ext.data.DataReader, {
		read : function (a) {
			var b = a.responseText;
			var c = Ext.decode(b);
			if (!c) {
				throw{
					message : "JsonReader.read: Json object not found"
				}
			}
			return this.readRecords(c)
		},
		readResponse : function (e, b) {
			var h = (b.responseText !== undefined) ? Ext.decode(b.responseText) : b;
			if (!h) {
				throw new Ext.data.JsonReader.Error("response")
			}
			var a = this.getRoot(h),
			g = this.getSuccess(h);
			if (g && e === Ext.data.Api.actions.create) {
				var d = Ext.isDefined(a);
				if (d && Ext.isEmpty(a)) {
					throw new Ext.data.JsonReader.Error("root-empty", this.meta.root)
				} else {
					if (!d) {
						throw new Ext.data.JsonReader.Error("root-undefined-response", this.meta.root)
					}
				}
			}
			var c = new Ext.data.Response({
						action : e,
						success : g,
						data : (a) ? this.extractData(a, false) : [],
						message : this.getMessage(h),
						raw : h
					});
			if (Ext.isEmpty(c.success)) {
				throw new Ext.data.JsonReader.Error("successProperty-response", this.meta.successProperty)
			}
			return c
		},
		readRecords : function (a) {
			this.jsonData = a;
			if (a.metaData) {
				this.onMetaChange(a.metaData)
			}
			var m = this.meta,
			h = this.recordType,
			b = h.prototype.fields,
			l = b.items,
			i = b.length,
			j;
			var g = this.getRoot(a),
			e = g.length,
			d = e,
			k = true;
			if (m.totalProperty) {
				j = parseInt(this.getTotal(a), 10);
				if (!isNaN(j)) {
					d = j
				}
			}
			if (m.successProperty) {
				j = this.getSuccess(a);
				if (j === false || j === "false") {
					k = false
				}
			}
			return {
				success : k,
				records : this.extractData(g, true),
				totalRecords : d
			}
		},
		buildExtractors : function () {
			if (this.ef) {
				return
			}
			var l = this.meta,
			h = this.recordType,
			e = h.prototype.fields,
			k = e.items,
			j = e.length;
			if (l.totalProperty) {
				this.getTotal = this.createAccessor(l.totalProperty)
			}
			if (l.successProperty) {
				this.getSuccess = this.createAccessor(l.successProperty)
			}
			if (l.messageProperty) {
				this.getMessage = this.createAccessor(l.messageProperty)
			}
			this.getRoot = l.root ? this.createAccessor(l.root) : function (g) {
				return g
			};
			if (l.id || l.idProperty) {
				var d = this.createAccessor(l.id || l.idProperty);
				this.getId = function (i) {
					var g = d(i);
					return (g === undefined || g === "") ? null : g
				}
			} else {
				this.getId = function () {
					return null
				}
			}
			var c = [];
			for (var b = 0; b < j; b++) {
				e = k[b];
				var a = (e.mapping !== undefined && e.mapping !== null) ? e.mapping : e.name;
				c.push(this.createAccessor(a))
			}
			this.ef = c
		},
		simpleAccess : function (b, a) {
			return b[a]
		},
		createAccessor : function () {
			var a = /[\[\.]/;
			return function (c) {
				if (Ext.isEmpty(c)) {
					return Ext.emptyFn
				}
				if (Ext.isFunction(c)) {
					return c
				}
				var b = String(c).search(a);
				if (b >= 0) {
					return new Function("obj", "return obj" + (b > 0 ? "." : "") + c)
				}
				return function (d) {
					return d[c]
				}
			}
		}
		(),
		extractValues : function (h, d, a) {
			var g,
			c = {};
			for (var e = 0; e < a; e++) {
				g = d[e];
				var b = this.ef[e](h);
				c[g.name] = g.convert((b !== undefined) ? b : g.defaultValue, h)
			}
			return c
		}
	});
Ext.data.JsonReader.Error = Ext.extend(Ext.Error, {
			constructor : function (b, a) {
				this.arg = a;
				Ext.Error.call(this, b)
			},
			name : "Ext.data.JsonReader"
		});
Ext.apply(Ext.data.JsonReader.Error.prototype, {
		lang : {
			response : "An error occurred while json-decoding your server response",
			"successProperty-response" : 'Could not locate your "successProperty" in your server response.  Please review your JsonReader config to ensure the config-property "successProperty" matches the property in your server-response.  See the JsonReader docs.',
			"root-undefined-config" : 'Your JsonReader was configured without a "root" property.  Please review your JsonReader config and make sure to define the root property.  See the JsonReader docs.',
			"idProperty-undefined" : 'Your JsonReader was configured without an "idProperty"  Please review your JsonReader configuration and ensure the "idProperty" is set (e.g.: "id").  See the JsonReader docs.',
			"root-empty" : 'Data was expected to be returned by the server in the "root" property of the response.  Please review your JsonReader configuration to ensure the "root" property matches that returned in the server-response.  See JsonReader docs.'
		}
	});
Ext.data.ArrayReader = Ext.extend(Ext.data.JsonReader, {
			readRecords : function (r) {
				this.arrayData = r;
				var l = this.meta,
				d = l ? Ext.num(l.idIndex, l.id) : null,
				b = this.recordType,
				q = b.prototype.fields,
				z = [],
				e = true,
				g;
				var u = this.getRoot(r);
				for (var y = 0, A = u.length; y < A; y++) {
					var t = u[y],
					a = {},
					p = ((d || d === 0) && t[d] !== undefined && t[d] !== "" ? t[d] : null);
					for (var x = 0, m = q.length; x < m; x++) {
						var B = q.items[x],
						w = B.mapping !== undefined && B.mapping !== null ? B.mapping : x;
						g = t[w] !== undefined ? t[w] : B.defaultValue;
						g = B.convert(g, t);
						a[B.name] = g
					}
					var c = new b(a, p);
					c.json = t;
					z[z.length] = c
				}
				var h = z.length;
				if (l.totalProperty) {
					g = parseInt(this.getTotal(r), 10);
					if (!isNaN(g)) {
						h = g
					}
				}
				if (l.successProperty) {
					g = this.getSuccess(r);
					if (g === false || g === "false") {
						e = false
					}
				}
				return {
					success : e,
					records : z,
					totalRecords : h
				}
			}
		});
Ext.data.ArrayStore = Ext.extend(Ext.data.Store, {
			constructor : function (a) {
				Ext.data.ArrayStore.superclass.constructor.call(this, Ext.apply(a, {
							reader : new Ext.data.ArrayReader(a)
						}))
			},
			loadData : function (e, b) {
				if (this.expandData === true) {
					var d = [];
					for (var c = 0, a = e.length; c < a; c++) {
						d[d.length] = [e[c]]
					}
					e = d
				}
				Ext.data.ArrayStore.superclass.loadData.call(this, e, b)
			}
		});
Ext.reg("arraystore", Ext.data.ArrayStore);
Ext.data.SimpleStore = Ext.data.ArrayStore;
Ext.reg("simplestore", Ext.data.SimpleStore);
Ext.data.JsonStore = Ext.extend(Ext.data.Store, {
			constructor : function (a) {
				Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(a, {
							reader : new Ext.data.JsonReader(a)
						}))
			}
		});
Ext.reg("jsonstore", Ext.data.JsonStore);
Ext.data.XmlWriter = function (a) {
	Ext.data.XmlWriter.superclass.constructor.apply(this, arguments);
	this.tpl = (typeof(this.tpl) === "string") ? new Ext.XTemplate(this.tpl).compile() : this.tpl.compile()
};
Ext.extend(Ext.data.XmlWriter, Ext.data.DataWriter, {
		documentRoot : "xrequest",
		forceDocumentRoot : false,
		root : "records",
		xmlVersion : "1.0",
		xmlEncoding : "ISO-8859-15",
		tpl : '<tpl for="."><\u003fxml version="{version}" encoding="{encoding}"\u003f><tpl if="documentRoot"><{documentRoot}><tpl for="baseParams"><tpl for="."><{name}>{value}</{name}></tpl></tpl></tpl><tpl if="records.length&gt;1"><{root}></tpl><tpl for="records"><{parent.record}><tpl for="."><{name}>{value}</{name}></tpl></{parent.record}></tpl><tpl if="records.length&gt;1"></{root}></tpl><tpl if="documentRoot"></{documentRoot}></tpl></tpl>',
		render : function (b, c, a) {
			c = this.toArray(c);
			b.xmlData = this.tpl.applyTemplate({
						version : this.xmlVersion,
						encoding : this.xmlEncoding,
						documentRoot : (c.length > 0 || this.forceDocumentRoot === true) ? this.documentRoot : false,
						record : this.meta.record,
						root : this.root,
						baseParams : c,
						records : (Ext.isArray(a[0])) ? a : [a]
					})
		},
		createRecord : function (a) {
			return this.toArray(this.toHash(a))
		},
		updateRecord : function (a) {
			return this.toArray(this.toHash(a))
		},
		destroyRecord : function (b) {
			var a = {};
			a[this.meta.idProperty] = b.id;
			return this.toArray(a)
		}
	});
Ext.data.XmlReader = function (a, b) {
	a = a || {};
	Ext.applyIf(a, {
			idProperty : a.idProperty || a.idPath || a.id,
			successProperty : a.successProperty || a.success
		});
	Ext.data.XmlReader.superclass.constructor.call(this, a, b || a.fields)
};
Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, {
		read : function (a) {
			var b = a.responseXML;
			if (!b) {
				throw{
					message : "XmlReader.read: XML Document not available"
				}
			}
			return this.readRecords(b)
		},
		readRecords : function (d) {
			this.xmlData = d;
			var a = d.documentElement || d,
			c = Ext.DomQuery,
			g = 0,
			e = true;
			if (this.meta.totalProperty) {
				g = this.getTotal(a, 0)
			}
			if (this.meta.successProperty) {
				e = this.getSuccess(a)
			}
			var b = this.extractData(c.select(this.meta.record, a), true);
			return {
				success : e,
				records : b,
				totalRecords : g || b.length
			}
		},
		readResponse : function (g, b) {
			var e = Ext.DomQuery,
			h = b.responseXML,
			a = h.documentElement || h;
			var c = new Ext.data.Response({
						action : g,
						success : this.getSuccess(a),
						message : this.getMessage(a),
						data : this.extractData(e.select(this.meta.record, a) || e.select(this.meta.root, a), false),
						raw : h
					});
			if (Ext.isEmpty(c.success)) {
				throw new Ext.data.DataReader.Error("successProperty-response", this.meta.successProperty)
			}
			if (g === Ext.data.Api.actions.create) {
				var d = Ext.isDefined(c.data);
				if (d && Ext.isEmpty(c.data)) {
					throw new Ext.data.JsonReader.Error("root-empty", this.meta.root)
				} else {
					if (!d) {
						throw new Ext.data.JsonReader.Error("root-undefined-response", this.meta.root)
					}
				}
			}
			return c
		},
		getSuccess : function () {
			return true
		},
		buildExtractors : function () {
			if (this.ef) {
				return
			}
			var l = this.meta,
			h = this.recordType,
			e = h.prototype.fields,
			k = e.items,
			j = e.length;
			if (l.totalProperty) {
				this.getTotal = this.createAccessor(l.totalProperty)
			}
			if (l.successProperty) {
				this.getSuccess = this.createAccessor(l.successProperty)
			}
			if (l.messageProperty) {
				this.getMessage = this.createAccessor(l.messageProperty)
			}
			this.getRoot = function (g) {
				return (!Ext.isEmpty(g[this.meta.record])) ? g[this.meta.record] : g[this.meta.root]
			};
			if (l.idPath || l.idProperty) {
				var d = this.createAccessor(l.idPath || l.idProperty);
				this.getId = function (g) {
					var i = d(g) || g.id;
					return (i === undefined || i === "") ? null : i
				}
			} else {
				this.getId = function () {
					return null
				}
			}
			var c = [];
			for (var b = 0; b < j; b++) {
				e = k[b];
				var a = (e.mapping !== undefined && e.mapping !== null) ? e.mapping : e.name;
				c.push(this.createAccessor(a))
			}
			this.ef = c
		},
		createAccessor : function () {
			var a = Ext.DomQuery;
			return function (b) {
				if (Ext.isFunction(b)) {
					return b
				}
				switch (b) {
				case this.meta.totalProperty:
					return function (c, d) {
						return a.selectNumber(b, c, d)
					};
					break;
				case this.meta.successProperty:
					return function (d, e) {
						var c = a.selectValue(b, d, true);
						var g = c !== false && c !== "false";
						return g
					};
					break;
				default:
					return function (c, d) {
						return a.selectValue(b, c, d)
					};
					break
				}
			}
		}
		(),
		extractValues : function (h, d, a) {
			var g,
			c = {};
			for (var e = 0; e < a; e++) {
				g = d[e];
				var b = this.ef[e](h);
				c[g.name] = g.convert((b !== undefined) ? b : g.defaultValue, h)
			}
			return c
		}
	});
Ext.data.XmlStore = Ext.extend(Ext.data.Store, {
			constructor : function (a) {
				Ext.data.XmlStore.superclass.constructor.call(this, Ext.apply(a, {
							reader : new Ext.data.XmlReader(a)
						}))
			}
		});
Ext.reg("xmlstore", Ext.data.XmlStore);
Ext.data.GroupingStore = Ext.extend(Ext.data.Store, {
			constructor : function (d) {
				d = d || {};
				this.hasMultiSort = true;
				this.multiSortInfo = this.multiSortInfo || {
						sorters : []
					};
				var e = this.multiSortInfo.sorters,
				c = d.groupField || this.groupField,
				b = d.sortInfo || this.sortInfo,
				a = d.groupDir || this.groupDir;
				if (c) {
					e.push({
							field : c,
							direction : a
						})
				}
				if (b) {
					e.push(b)
				}
				Ext.data.GroupingStore.superclass.constructor.call(this, d);
				this.addEvents("groupchange");
				this.applyGroupField()
			},
			remoteGroup : false,
			groupOnSort : false,
			groupDir : "ASC",
			clearGrouping : function () {
				this.groupField = false;
				if (this.remoteGroup) {
					if (this.baseParams) {
						delete this.baseParams.groupBy;
						delete this.baseParams.groupDir
					}
					var a = this.lastOptions;
					if (a && a.params) {
						delete a.params.groupBy;
						delete a.params.groupDir
					}
					this.reload()
				} else {
					this.sort();
					this.fireEvent("datachanged", this)
				}
			},
			groupBy : function (e, a, d) {
				d = d ? (String(d).toUpperCase() == "DESC" ? "DESC" : "ASC") : this.groupDir;
				if (this.groupField == e && this.groupDir == d && !a) {
					return
				}
				var c = this.multiSortInfo.sorters;
				if (c.length > 0 && c[0].field == this.groupField) {
					c.shift()
				}
				this.groupField = e;
				this.groupDir = d;
				this.applyGroupField();
				var b = function () {
					this.fireEvent("groupchange", this, this.getGroupState())
				};
				if (this.groupOnSort) {
					this.sort(e, d);
					b.call(this);
					return
				}
				if (this.remoteGroup) {
					this.on("load", b, this, {
							single : true
						});
					this.reload()
				} else {
					this.sort(c);
					b.call(this)
				}
			},
			sort : function (h, c) {
				if (this.remoteSort) {
					return Ext.data.GroupingStore.superclass.sort.call(this, h, c)
				}
				var g = [];
				if (Ext.isArray(arguments[0])) {
					g = arguments[0]
				} else {
					if (h == undefined) {
						g = this.sortInfo ? [this.sortInfo] : []
					} else {
						var e = this.fields.get(h);
						if (!e) {
							return false
						}
						var b = e.name,
						a = this.sortInfo || null,
						d = this.sortToggle ? this.sortToggle[b] : null;
						if (!c) {
							if (a && a.field == b) {
								c = (this.sortToggle[b] || "ASC").toggle("ASC", "DESC")
							} else {
								c = e.sortDir
							}
						}
						this.sortToggle[b] = c;
						this.sortInfo = {
							field : b,
							direction : c
						};
						g = [this.sortInfo]
					}
				}
				if (this.groupField) {
					g.unshift({
							direction : this.groupDir,
							field : this.groupField
						})
				}
				return this.multiSort.call(this, g, c)
			},
			applyGroupField : function () {
				if (this.remoteGroup) {
					if (!this.baseParams) {
						this.baseParams = {}
						
					}
					Ext.apply(this.baseParams, {
							groupBy : this.groupField,
							groupDir : this.groupDir
						});
					var a = this.lastOptions;
					if (a && a.params) {
						a.params.groupDir = this.groupDir;
						delete a.params.groupBy
					}
				}
			},
			applyGrouping : function (a) {
				if (this.groupField !== false) {
					this.groupBy(this.groupField, true, this.groupDir);
					return true
				} else {
					if (a === true) {
						this.fireEvent("datachanged", this)
					}
					return false
				}
			},
			getGroupState : function () {
				return this.groupOnSort && this.groupField !== false ? (this.sortInfo ? this.sortInfo.field : undefined) : this.groupField
			}
		});
Ext.reg("groupingstore", Ext.data.GroupingStore);
Ext.data.DirectProxy = function (a) {
	Ext.apply(this, a);
	if (typeof this.paramOrder == "string") {
		this.paramOrder = this.paramOrder.split(/[\s,|]/)
	}
	Ext.data.DirectProxy.superclass.constructor.call(this, a)
};
Ext.extend(Ext.data.DirectProxy, Ext.data.DataProxy, {
		paramOrder : undefined,
		paramsAsHash : true,
		directFn : undefined,
		doRequest : function (b, c, a, e, k, l, n) {
			var j = [],
			h = this.api[b] || this.directFn;
			switch (b) {
			case Ext.data.Api.actions.create:
				j.push(a.jsonData);
				break;
			case Ext.data.Api.actions.read:
				if (h.directCfg.method.len > 0) {
					if (this.paramOrder) {
						for (var d = 0, g = this.paramOrder.length; d < g; d++) {
							j.push(a[this.paramOrder[d]])
						}
					} else {
						if (this.paramsAsHash) {
							j.push(a)
						}
					}
				}
				break;
			case Ext.data.Api.actions.update:
				j.push(a.jsonData);
				break;
			case Ext.data.Api.actions.destroy:
				j.push(a.jsonData);
				break
			}
			var m = {
				params : a || {},
				request : {
					callback : k,
					scope : l,
					arg : n
				},
				reader : e
			};
			j.push(this.createCallback(b, c, m), this);
			h.apply(window, j)
		},
		createCallback : function (d, a, b) {
			var c = this;
			return function (e, g) {
				if (!g.status) {
					if (d === Ext.data.Api.actions.read) {
						c.fireEvent("loadexception", c, b, g, null)
					}
					c.fireEvent("exception", c, "remote", d, b, g, null);
					b.request.callback.call(b.request.scope, null, b.request.arg, false);
					return
				}
				if (d === Ext.data.Api.actions.read) {
					c.onRead(d, b, e, g)
				} else {
					c.onWrite(d, b, e, g, a)
				}
			}
		},
		onRead : function (g, e, a, d) {
			var b;
			try {
				b = e.reader.readRecords(a)
			} catch (c) {
				this.fireEvent("loadexception", this, e, d, c);
				this.fireEvent("exception", this, "response", g, e, d, c);
				e.request.callback.call(e.request.scope, null, e.request.arg, false);
				return
			}
			this.fireEvent("load", this, d, e.request.arg);
			e.request.callback.call(e.request.scope, b, e.request.arg, true)
		},
		onWrite : function (g, d, a, c, b) {
			var e = d.reader.extractData(d.reader.getRoot(a), false);
			var h = d.reader.getSuccess(a);
			h = (h !== false);
			if (h) {
				this.fireEvent("write", this, g, e, c, b, d.request.arg)
			} else {
				this.fireEvent("exception", this, "remote", g, d, a, b)
			}
			d.request.callback.call(d.request.scope, e, c, h)
		}
	});
Ext.data.DirectStore = Ext.extend(Ext.data.Store, {
			constructor : function (a) {
				var b = Ext.apply({}, {
							batchTransactions : false
						}, a);
				Ext.data.DirectStore.superclass.constructor.call(this, Ext.apply(b, {
							proxy : Ext.isDefined(b.proxy) ? b.proxy : new Ext.data.DirectProxy(Ext.copyTo({}, b, "paramOrder,paramsAsHash,directFn,api")),
							reader : (!Ext.isDefined(b.reader) && b.fields) ? new Ext.data.JsonReader(Ext.copyTo({}, b, "totalProperty,root,idProperty"), b.fields) : b.reader
						}))
			}
		});
Ext.reg("directstore", Ext.data.DirectStore);
Ext.Direct = Ext.extend(Ext.util.Observable, {
			exceptions : {
				TRANSPORT : "xhr",
				PARSE : "parse",
				LOGIN : "login",
				SERVER : "exception"
			},
			constructor : function () {
				this.addEvents("event", "exception");
				this.transactions = {};
				this.providers = {}
				
			},
			addProvider : function (e) {
				var c = arguments;
				if (c.length > 1) {
					for (var d = 0, b = c.length; d < b; d++) {
						this.addProvider(c[d])
					}
					return
				}
				if (!e.events) {
					e = new Ext.Direct.PROVIDERS[e.type](e)
				}
				e.id = e.id || Ext.id();
				this.providers[e.id] = e;
				e.on("data", this.onProviderData, this);
				e.on("exception", this.onProviderException, this);
				if (!e.isConnected()) {
					e.connect()
				}
				return e
			},
			getProvider : function (a) {
				return this.providers[a]
			},
			removeProvider : function (b) {
				var a = b.id ? b : this.providers[b];
				a.un("data", this.onProviderData, this);
				a.un("exception", this.onProviderException, this);
				delete this.providers[a.id];
				return a
			},
			addTransaction : function (a) {
				this.transactions[a.tid] = a;
				return a
			},
			removeTransaction : function (a) {
				delete this.transactions[a.tid || a];
				return a
			},
			getTransaction : function (a) {
				return this.transactions[a.tid || a]
			},
			onProviderData : function (d, c) {
				if (Ext.isArray(c)) {
					for (var b = 0, a = c.length; b < a; b++) {
						this.onProviderData(d, c[b])
					}
					return
				}
				if (c.name && c.name != "event" && c.name != "exception") {
					this.fireEvent(c.name, c)
				} else {
					if (c.type == "exception") {
						this.fireEvent("exception", c)
					}
				}
				this.fireEvent("event", c, d)
			},
			createEvent : function (a, b) {
				return new Ext.Direct.eventTypes[a.type](Ext.apply(a, b))
			}
		});
Ext.Direct = new Ext.Direct();
Ext.Direct.TID = 1;
Ext.Direct.PROVIDERS = {};
Ext.Direct.Transaction = function (a) {
	Ext.apply(this, a);
	this.tid = ++Ext.Direct.TID;
	this.retryCount = 0
};
Ext.Direct.Transaction.prototype = {
	send : function () {
		this.provider.queueTransaction(this)
	},
	retry : function () {
		this.retryCount++;
		this.send()
	},
	getProvider : function () {
		return this.provider
	}
};
Ext.Direct.Event = function (a) {
	Ext.apply(this, a)
};
Ext.Direct.Event.prototype = {
	status : true,
	getData : function () {
		return this.data
	}
};
Ext.Direct.RemotingEvent = Ext.extend(Ext.Direct.Event, {
			type : "rpc",
			getTransaction : function () {
				return this.transaction || Ext.Direct.getTransaction(this.tid)
			}
		});
Ext.Direct.ExceptionEvent = Ext.extend(Ext.Direct.RemotingEvent, {
			status : false,
			type : "exception"
		});
Ext.Direct.eventTypes = {
	rpc : Ext.Direct.RemotingEvent,
	event : Ext.Direct.Event,
	exception : Ext.Direct.ExceptionEvent
};
Ext.direct.Provider = Ext.extend(Ext.util.Observable, {
			priority : 1,
			constructor : function (a) {
				Ext.apply(this, a);
				this.addEvents("connect", "disconnect", "data", "exception");
				Ext.direct.Provider.superclass.constructor.call(this, a)
			},
			isConnected : function () {
				return false
			},
			connect : Ext.emptyFn,
			disconnect : Ext.emptyFn
		});
Ext.direct.JsonProvider = Ext.extend(Ext.direct.Provider, {
			parseResponse : function (a) {
				if (!Ext.isEmpty(a.responseText)) {
					if (typeof a.responseText == "object") {
						return a.responseText
					}
					return Ext.decode(a.responseText)
				}
				return null
			},
			getEvents : function (j) {
				var g = null;
				try {
					g = this.parseResponse(j)
				} catch (h) {
					var d = new Ext.Direct.ExceptionEvent({
								data : h,
								xhr : j,
								code : Ext.Direct.exceptions.PARSE,
								message : "Error parsing json response: \n\n " + g
							});
					return [d]
				}
				var c = [];
				if (Ext.isArray(g)) {
					for (var b = 0, a = g.length; b < a; b++) {
						c.push(Ext.Direct.createEvent(g[b]))
					}
				} else {
					c.push(Ext.Direct.createEvent(g))
				}
				return c
			}
		});
Ext.direct.PollingProvider = Ext.extend(Ext.direct.JsonProvider, {
			priority : 3,
			interval : 3000,
			constructor : function (a) {
				Ext.direct.PollingProvider.superclass.constructor.call(this, a);
				this.addEvents("beforepoll", "poll")
			},
			isConnected : function () {
				return !!this.pollTask
			},
			connect : function () {
				if (this.url && !this.pollTask) {
					this.pollTask = Ext.TaskMgr.start({
								run : function () {
									if (this.fireEvent("beforepoll", this) !== false) {
										if (typeof this.url == "function") {
											this.url(this.baseParams)
										} else {
											Ext.Ajax.request({
													url : this.url,
													callback : this.onData,
													scope : this,
													params : this.baseParams
												})
										}
									}
								},
								interval : this.interval,
								scope : this
							});
					this.fireEvent("connect", this)
				} else {
					if (!this.url) {
						throw "Error initializing PollingProvider, no url configured."
					}
				}
			},
			disconnect : function () {
				if (this.pollTask) {
					Ext.TaskMgr.stop(this.pollTask);
					delete this.pollTask;
					this.fireEvent("disconnect", this)
				}
			},
			onData : function (d, j, h) {
				if (j) {
					var c = this.getEvents(h);
					for (var b = 0, a = c.length; b < a; b++) {
						var g = c[b];
						this.fireEvent("data", this, g)
					}
				} else {
					var g = new Ext.Direct.ExceptionEvent({
								data : g,
								code : Ext.Direct.exceptions.TRANSPORT,
								message : "Unable to connect to the server.",
								xhr : h
							});
					this.fireEvent("data", this, g)
				}
			}
		});
Ext.Direct.PROVIDERS.polling = Ext.direct.PollingProvider;
Ext.direct.RemotingProvider = Ext.extend(Ext.direct.JsonProvider, {
			enableBuffer : 10,
			maxRetries : 1,
			timeout : undefined,
			constructor : function (a) {
				Ext.direct.RemotingProvider.superclass.constructor.call(this, a);
				this.addEvents("beforecall", "call");
				this.namespace = (Ext.isString(this.namespace)) ? Ext.ns(this.namespace) : this.namespace || window;
				this.transactions = {};
				this.callBuffer = []
			},
			initAPI : function () {
				var h = this.actions;
				for (var j in h) {
					var d = this.namespace[j] || (this.namespace[j] = {}),
					e = h[j];
					for (var g = 0, b = e.length; g < b; g++) {
						var a = e[g];
						d[a.name] = this.createMethod(j, a)
					}
				}
			},
			isConnected : function () {
				return !!this.connected
			},
			connect : function () {
				if (this.url) {
					this.initAPI();
					this.connected = true;
					this.fireEvent("connect", this)
				} else {
					if (!this.url) {
						throw "Error initializing RemotingProvider, no url configured."
					}
				}
			},
			disconnect : function () {
				if (this.connected) {
					this.connected = false;
					this.fireEvent("disconnect", this)
				}
			},
			onData : function (a, h, j) {
				if (h) {
					var k = this.getEvents(j);
					for (var b = 0, c = k.length; b < c; b++) {
						var d = k[b],
						l = this.getTransaction(d);
						this.fireEvent("data", this, d);
						if (l) {
							this.doCallback(l, d, true);
							Ext.Direct.removeTransaction(l)
						}
					}
				} else {
					var g = [].concat(a.ts);
					for (var b = 0, c = g.length; b < c; b++) {
						var l = this.getTransaction(g[b]);
						if (l && l.retryCount < this.maxRetries) {
							l.retry()
						} else {
							var d = new Ext.Direct.ExceptionEvent({
										data : d,
										transaction : l,
										code : Ext.Direct.exceptions.TRANSPORT,
										message : "Unable to connect to the server.",
										xhr : j
									});
							this.fireEvent("data", this, d);
							if (l) {
								this.doCallback(l, d, false);
								Ext.Direct.removeTransaction(l)
							}
						}
					}
				}
			},
			getCallData : function (a) {
				return {
					action : a.action,
					method : a.method,
					data : a.data,
					type : "rpc",
					tid : a.tid
				}
			},
			doSend : function (d) {
				var g = {
					url : this.url,
					callback : this.onData,
					scope : this,
					ts : d,
					timeout : this.timeout
				},
				b;
				if (Ext.isArray(d)) {
					b = [];
					for (var c = 0, a = d.length; c < a; c++) {
						b.push(this.getCallData(d[c]))
					}
				} else {
					b = this.getCallData(d)
				}
				if (this.enableUrlEncode) {
					var e = {};
					e[Ext.isString(this.enableUrlEncode) ? this.enableUrlEncode : "data"] = Ext.encode(b);
					g.params = e
				} else {
					g.jsonData = b
				}
				Ext.Ajax.request(g)
			},
			combineAndSend : function () {
				var a = this.callBuffer.length;
				if (a > 0) {
					this.doSend(a == 1 ? this.callBuffer[0] : this.callBuffer);
					this.callBuffer = []
				}
			},
			queueTransaction : function (a) {
				if (a.form) {
					this.processForm(a);
					return
				}
				this.callBuffer.push(a);
				if (this.enableBuffer) {
					if (!this.callTask) {
						this.callTask = new Ext.util.DelayedTask(this.combineAndSend, this)
					}
					this.callTask.delay(Ext.isNumber(this.enableBuffer) ? this.enableBuffer : 10)
				} else {
					this.combineAndSend()
				}
			},
			doCall : function (i, a, b) {
				var h = null,
				e = b[a.len],
				g = b[a.len + 1];
				if (a.len !== 0) {
					h = b.slice(0, a.len)
				}
				var d = new Ext.Direct.Transaction({
							provider : this,
							args : b,
							action : i,
							method : a.name,
							data : h,
							cb : g && Ext.isFunction(e) ? e.createDelegate(g) : e
						});
				if (this.fireEvent("beforecall", this, d, a) !== false) {
					Ext.Direct.addTransaction(d);
					this.queueTransaction(d);
					this.fireEvent("call", this, d, a)
				}
			},
			doForm : function (j, b, g, i, e) {
				var d = new Ext.Direct.Transaction({
							provider : this,
							action : j,
							method : b.name,
							args : [g, i, e],
							cb : e && Ext.isFunction(i) ? i.createDelegate(e) : i,
							isForm : true
						});
				if (this.fireEvent("beforecall", this, d, b) !== false) {
					Ext.Direct.addTransaction(d);
					var a = String(g.getAttribute("enctype")).toLowerCase() == "multipart/form-data",
					h = {
						extTID : d.tid,
						extAction : j,
						extMethod : b.name,
						extType : "rpc",
						extUpload : String(a)
					};
					Ext.apply(d, {
							form : Ext.getDom(g),
							isUpload : a,
							params : i && Ext.isObject(i.params) ? Ext.apply(h, i.params) : h
						});
					this.fireEvent("call", this, d, b);
					this.processForm(d)
				}
			},
			processForm : function (a) {
				Ext.Ajax.request({
						url : this.url,
						params : a.params,
						callback : this.onData,
						scope : this,
						form : a.form,
						isUpload : a.isUpload,
						ts : a
					})
			},
			createMethod : function (d, a) {
				var b;
				if (!a.formHandler) {
					b = function () {
						this.doCall(d, a, Array.prototype.slice.call(arguments, 0))
					}
					.createDelegate(this)
				} else {
					b = function (e, g, c) {
						this.doForm(d, a, e, g, c)
					}
					.createDelegate(this)
				}
				b.directCfg = {
					action : d,
					method : a
				};
				return b
			},
			getTransaction : function (a) {
				return a && a.tid ? Ext.Direct.getTransaction(a.tid) : null
			},
			doCallback : function (c, g) {
				var d = g.status ? "success" : "failure";
				if (c && c.cb) {
					var b = c.cb,
					a = Ext.isDefined(g.result) ? g.result : g.data;
					if (Ext.isFunction(b)) {
						b(a, g)
					} else {
						Ext.callback(b[d], b.scope, [a, g]);
						Ext.callback(b.callback, b.scope, [a, g])
					}
				}
			}
		});
Ext.Direct.PROVIDERS.remoting = Ext.direct.RemotingProvider;
Ext.Resizable = Ext.extend(Ext.util.Observable, {
			constructor : function (d, e) {
				this.el = Ext.get(d);
				if (e && e.wrap) {
					e.resizeChild = this.el;
					this.el = this.el.wrap(typeof e.wrap == "object" ? e.wrap : {
								cls : "xresizable-wrap"
							});
					this.el.id = this.el.dom.id = e.resizeChild.id + "-rzwrap";
					this.el.setStyle("overflow", "hidden");
					this.el.setPositioning(e.resizeChild.getPositioning());
					e.resizeChild.clearPositioning();
					if (!e.width || !e.height) {
						var g = e.resizeChild.getSize();
						this.el.setSize(g.width, g.height)
					}
					if (e.pinned && !e.adjustments) {
						e.adjustments = "auto"
					}
				}
				this.proxy = this.el.createProxy({
							tag : "div",
							cls : "x-resizable-proxy",
							id : this.el.id + "-rzproxy"
						}, Ext.getBody());
				this.proxy.unselectable();
				this.proxy.enableDisplayMode("block");
				Ext.apply(this, e);
				if (this.pinned) {
					this.disableTrackOver = true;
					this.el.addClass("x-resizable-pinned")
				}
				var k = this.el.getStyle("position");
				if (k != "absolute" && k != "fixed") {
					this.el.setStyle("position", "relative")
				}
				if (!this.handles) {
					this.handles = "s,e,se";
					if (this.multiDirectional) {
						this.handles += ",n,w"
					}
				}
				if (this.handles == "all") {
					this.handles = "n s e w ne nw se sw"
				}
				var o = this.handles.split(/\s*?[,;]\s*?| /);
				var c = Ext.Resizable.positions;
				for (var j = 0, l = o.length; j < l; j++) {
					if (o[j] && c[o[j]]) {
						var n = c[o[j]];
						this[n] = new Ext.Resizable.Handle(this, n, this.disableTrackOver, this.transparent, this.handleCls)
					}
				}
				this.corner = this.southeast;
				if (this.handles.indexOf("n") != -1 || this.handles.indexOf("w") != -1) {
					this.updateBox = true
				}
				this.activeHandle = null;
				if (this.resizeChild) {
					if (typeof this.resizeChild == "boolean") {
						this.resizeChild = Ext.get(this.el.dom.firstChild, true)
					} else {
						this.resizeChild = Ext.get(this.resizeChild, true)
					}
				}
				if (this.adjustments == "auto") {
					var b = this.resizeChild;
					var m = this.west,
					h = this.east,
					a = this.north,
					o = this.south;
					if (b && (m || a)) {
						b.position("relative");
						b.setLeft(m ? m.el.getWidth() : 0);
						b.setTop(a ? a.el.getHeight() : 0)
					}
					this.adjustments = [(h ? -h.el.getWidth() : 0) + (m ? -m.el.getWidth() : 0), (a ? -a.el.getHeight() : 0) + (o ? -o.el.getHeight() : 0) - 1]
				}
				if (this.draggable) {
					this.dd = this.dynamic ? this.el.initDD(null) : this.el.initDDProxy(null, {
								dragElId : this.proxy.id
							});
					this.dd.setHandleElId(this.resizeChild ? this.resizeChild.id : this.el.id);
					if (this.constrainTo) {
						this.dd.constrainTo(this.constrainTo)
					}
				}
				this.addEvents("beforeresize", "resize");
				if (this.width !== null && this.height !== null) {
					this.resizeTo(this.width, this.height)
				} else {
					this.updateChildSize()
				}
				if (Ext.isIE) {
					this.el.dom.style.zoom = 1
				}
				Ext.Resizable.superclass.constructor.call(this)
			},
			adjustments : [0, 0],
			animate : false,
			disableTrackOver : false,
			draggable : false,
			duration : 0.35,
			dynamic : false,
			easing : "easeOutStrong",
			enabled : true,
			handles : false,
			multiDirectional : false,
			height : null,
			width : null,
			heightIncrement : 0,
			widthIncrement : 0,
			minHeight : 5,
			minWidth : 5,
			maxHeight : 10000,
			maxWidth : 10000,
			minX : 0,
			minY : 0,
			pinned : false,
			preserveRatio : false,
			resizeChild : false,
			transparent : false,
			resizeTo : function (b, a) {
				this.el.setSize(b, a);
				this.updateChildSize();
				this.fireEvent("resize", this, b, a, null)
			},
			startSizing : function (c, b) {
				this.fireEvent("beforeresize", this, c);
				if (this.enabled) {
					if (!this.overlay) {
						this.overlay = this.el.createProxy({
									tag : "div",
									cls : "x-resizable-overlay",
									html : "&#160;"
								}, Ext.getBody());
						this.overlay.unselectable();
						this.overlay.enableDisplayMode("block");
						this.overlay.on({
								scope : this,
								mousemove : this.onMouseMove,
								mouseup : this.onMouseUp
							})
					}
					this.overlay.setStyle("cursor", b.el.getStyle("cursor"));
					this.resizing = true;
					this.startBox = this.el.getBox();
					this.startPoint = c.getXY();
					this.offsets = [(this.startBox.x + this.startBox.width) - this.startPoint[0], (this.startBox.y + this.startBox.height) - this.startPoint[1]];
					this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
					this.overlay.show();
					if (this.constrainTo) {
						var a = Ext.get(this.constrainTo);
						this.resizeRegion = a.getRegion().adjust(a.getFrameWidth("t"), a.getFrameWidth("l"), -a.getFrameWidth("b"), -a.getFrameWidth("r"))
					}
					this.proxy.setStyle("visibility", "hidden");
					this.proxy.show();
					this.proxy.setBox(this.startBox);
					if (!this.dynamic) {
						this.proxy.setStyle("visibility", "visible")
					}
				}
			},
			onMouseDown : function (a, b) {
				if (this.enabled) {
					b.stopEvent();
					this.activeHandle = a;
					this.startSizing(b, a)
				}
			},
			onMouseUp : function (b) {
				this.activeHandle = null;
				var a = this.resizeElement();
				this.resizing = false;
				this.handleOut();
				this.overlay.hide();
				this.proxy.hide();
				this.fireEvent("resize", this, a.width, a.height, b)
			},
			updateChildSize : function () {
				if (this.resizeChild) {
					var d = this.el;
					var e = this.resizeChild;
					var c = this.adjustments;
					if (d.dom.offsetWidth) {
						var a = d.getSize(true);
						e.setSize(a.width + c[0], a.height + c[1])
					}
					if (Ext.isIE) {
						setTimeout(function () {
								if (d.dom.offsetWidth) {
									var g = d.getSize(true);
									e.setSize(g.width + c[0], g.height + c[1])
								}
							}, 10)
					}
				}
			},
			snap : function (c, e, b) {
				if (!e || !c) {
					return c
				}
				var d = c;
				var a = c % e;
				if (a > 0) {
					if (a > (e / 2)) {
						d = c + (e - a)
					} else {
						d = c - a
					}
				}
				return Math.max(b, d)
			},
			resizeElement : function () {
				var a = this.proxy.getBox();
				if (this.updateBox) {
					this.el.setBox(a, false, this.animate, this.duration, null, this.easing)
				} else {
					this.el.setSize(a.width, a.height, this.animate, this.duration, null, this.easing)
				}
				this.updateChildSize();
				if (!this.dynamic) {
					this.proxy.hide()
				}
				if (this.draggable && this.constrainTo) {
					this.dd.resetConstraints();
					this.dd.constrainTo(this.constrainTo)
				}
				return a
			},
			constrain : function (b, c, a, d) {
				if (b - c < a) {
					c = b - a
				} else {
					if (b - c > d) {
						c = b - d
					}
				}
				return c
			},
			onMouseMove : function (z) {
				if (this.enabled && this.activeHandle) {
					try {
						if (this.resizeRegion && !this.resizeRegion.contains(z.getPoint())) {
							return
						}
						var t = this.curSize || this.startBox,
						l = this.startBox.x,
						k = this.startBox.y,
						c = l,
						b = k,
						m = t.width,
						u = t.height,
						d = m,
						o = u,
						n = this.minWidth,
						A = this.minHeight,
						s = this.maxWidth,
						D = this.maxHeight,
						i = this.widthIncrement,
						a = this.heightIncrement,
						B = z.getXY(),
						r =  - (this.startPoint[0] - Math.max(this.minX, B[0])),
						p =  - (this.startPoint[1] - Math.max(this.minY, B[1])),
						j = this.activeHandle.position,
						E,
						g;
						switch (j) {
						case "east":
							m += r;
							m = Math.min(Math.max(n, m), s);
							break;
						case "south":
							u += p;
							u = Math.min(Math.max(A, u), D);
							break;
						case "southeast":
							m += r;
							u += p;
							m = Math.min(Math.max(n, m), s);
							u = Math.min(Math.max(A, u), D);
							break;
						case "north":
							p = this.constrain(u, p, A, D);
							k += p;
							u -= p;
							break;
						case "west":
							r = this.constrain(m, r, n, s);
							l += r;
							m -= r;
							break;
						case "northeast":
							m += r;
							m = Math.min(Math.max(n, m), s);
							p = this.constrain(u, p, A, D);
							k += p;
							u -= p;
							break;
						case "northwest":
							r = this.constrain(m, r, n, s);
							p = this.constrain(u, p, A, D);
							k += p;
							u -= p;
							l += r;
							m -= r;
							break;
						case "southwest":
							r = this.constrain(m, r, n, s);
							u += p;
							u = Math.min(Math.max(A, u), D);
							l += r;
							m -= r;
							break
						}
						var q = this.snap(m, i, n);
						var C = this.snap(u, a, A);
						if (q != m || C != u) {
							switch (j) {
							case "northeast":
								k -= C - u;
								break;
							case "north":
								k -= C - u;
								break;
							case "southwest":
								l -= q - m;
								break;
							case "west":
								l -= q - m;
								break;
							case "northwest":
								l -= q - m;
								k -= C - u;
								break
							}
							m = q;
							u = C
						}
						if (this.preserveRatio) {
							switch (j) {
							case "southeast":
							case "east":
								u = o * (m / d);
								u = Math.min(Math.max(A, u), D);
								m = d * (u / o);
								break;
							case "south":
								m = d * (u / o);
								m = Math.min(Math.max(n, m), s);
								u = o * (m / d);
								break;
							case "northeast":
								m = d * (u / o);
								m = Math.min(Math.max(n, m), s);
								u = o * (m / d);
								break;
							case "north":
								E = m;
								m = d * (u / o);
								m = Math.min(Math.max(n, m), s);
								u = o * (m / d);
								l += (E - m) / 2;
								break;
							case "southwest":
								u = o * (m / d);
								u = Math.min(Math.max(A, u), D);
								E = m;
								m = d * (u / o);
								l += E - m;
								break;
							case "west":
								g = u;
								u = o * (m / d);
								u = Math.min(Math.max(A, u), D);
								k += (g - u) / 2;
								E = m;
								m = d * (u / o);
								l += E - m;
								break;
							case "northwest":
								E = m;
								g = u;
								u = o * (m / d);
								u = Math.min(Math.max(A, u), D);
								m = d * (u / o);
								k += g - u;
								l += E - m;
								break
							}
						}
						this.proxy.setBounds(l, k, m, u);
						if (this.dynamic) {
							this.resizeElement()
						}
					} catch (v) {}
					
				}
			},
			handleOver : function () {
				if (this.enabled) {
					this.el.addClass("x-resizable-over")
				}
			},
			handleOut : function () {
				if (!this.resizing) {
					this.el.removeClass("x-resizable-over")
				}
			},
			getEl : function () {
				return this.el
			},
			getResizeChild : function () {
				return this.resizeChild
			},
			destroy : function (b) {
				Ext.destroy(this.dd, this.overlay, this.proxy);
				this.overlay = null;
				this.proxy = null;
				var c = Ext.Resizable.positions;
				for (var a in c) {
					if (typeof c[a] != "function" && this[c[a]]) {
						this[c[a]].destroy()
					}
				}
				if (b) {
					this.el.update("");
					Ext.destroy(this.el);
					this.el = null
				}
				this.purgeListeners()
			},
			syncHandleHeight : function () {
				var a = this.el.getHeight(true);
				if (this.west) {
					this.west.el.setHeight(a)
				}
				if (this.east) {
					this.east.el.setHeight(a)
				}
			}
		});
Ext.Resizable.positions = {
	n : "north",
	s : "south",
	e : "east",
	w : "west",
	se : "southeast",
	sw : "southwest",
	nw : "northwest",
	ne : "northeast"
};
Ext.Resizable.Handle = Ext.extend(Object, {
			constructor : function (d, g, c, e, a) {
				if (!this.tpl) {
					var b = Ext.DomHelper.createTemplate({
								tag : "div",
								cls : "x-resizable-handle x-resizable-handle-{0}"
							});
					b.compile();
					Ext.Resizable.Handle.prototype.tpl = b
				}
				this.position = g;
				this.rz = d;
				this.el = this.tpl.append(d.el.dom, [this.position], true);
				this.el.unselectable();
				if (e) {
					this.el.setOpacity(0)
				}
				if (!Ext.isEmpty(a)) {
					this.el.addClass(a)
				}
				this.el.on("mousedown", this.onMouseDown, this);
				if (!c) {
					this.el.on({
							scope : this,
							mouseover : this.onMouseOver,
							mouseout : this.onMouseOut
						})
				}
			},
			afterResize : function (a) {},
			onMouseDown : function (a) {
				this.rz.onMouseDown(this, a)
			},
			onMouseOver : function (a) {
				this.rz.handleOver(this, a)
			},
			onMouseOut : function (a) {
				this.rz.handleOut(this, a)
			},
			destroy : function () {
				Ext.destroy(this.el);
				this.el = null
			}
		});
Ext.Window = Ext.extend(Ext.Panel, {
			baseCls : "x-window",
			resizable : true,
			draggable : true,
			closable : true,
			closeAction : "close",
			constrain : false,
			constrainHeader : false,
			plain : false,
			minimizable : false,
			maximizable : false,
			minHeight : 100,
			minWidth : 200,
			expandOnShow : true,
			showAnimDuration : 0.25,
			hideAnimDuration : 0.25,
			collapsible : false,
			initHidden : undefined,
			hidden : true,
			elements : "header,body",
			frame : true,
			floating : true,
			initComponent : function () {
				this.initTools();
				Ext.Window.superclass.initComponent.call(this);
				this.addEvents("resize", "maximize", "minimize", "restore");
				if (Ext.isDefined(this.initHidden)) {
					this.hidden = this.initHidden
				}
				if (this.hidden === false) {
					this.hidden = true;
					this.show()
				}
			},
			getState : function () {
				return Ext.apply(Ext.Window.superclass.getState.call(this) || {}, this.getBox(true))
			},
			onRender : function (b, a) {
				Ext.Window.superclass.onRender.call(this, b, a);
				if (this.plain) {
					this.el.addClass("x-window-plain")
				}
				this.focusEl = this.el.createChild({
							tag : "a",
							href : "#",
							cls : "x-dlg-focus",
							tabIndex : "-1",
							html : "&#160;"
						});
				this.focusEl.swallowEvent("click", true);
				this.proxy = this.el.createProxy("x-window-proxy");
				this.proxy.enableDisplayMode("block");
				if (this.modal) {
					this.mask = this.container.createChild({
								cls : "ext-el-mask"
							}, this.el.dom);
					this.mask.enableDisplayMode("block");
					this.mask.hide();
					this.mon(this.mask, "click", this.focus, this)
				}
				if (this.maximizable) {
					this.mon(this.header, "dblclick", this.toggleMaximize, this)
				}
			},
			initEvents : function () {
				Ext.Window.superclass.initEvents.call(this);
				if (this.animateTarget) {
					this.setAnimateTarget(this.animateTarget)
				}
				if (this.resizable) {
					this.resizer = new Ext.Resizable(this.el, {
								minWidth : this.minWidth,
								minHeight : this.minHeight,
								handles : this.resizeHandles || "all",
								pinned : true,
								resizeElement : this.resizerAction,
								handleCls : "x-window-handle"
							});
					this.resizer.window = this;
					this.mon(this.resizer, "beforeresize", this.beforeResize, this)
				}
				if (this.draggable) {
					this.header.addClass("x-window-draggable")
				}
				this.mon(this.el, "mousedown", this.toFront, this);
				this.manager = this.manager || Ext.WindowMgr;
				this.manager.register(this);
				if (this.maximized) {
					this.maximized = false;
					this.maximize()
				}
				if (this.closable) {
					var a = this.getKeyMap();
					a.on(27, this.onEsc, this);
					a.disable()
				}
			},
			initDraggable : function () {
				this.dd = new Ext.Window.DD(this)
			},
			onEsc : function (a, b) {
				if (this.activeGhost) {
					this.unghost()
				}
				b.stopEvent();
				this[this.closeAction]()
			},
			beforeDestroy : function () {
				if (this.rendered) {
					this.hide();
					this.clearAnchor();
					Ext.destroy(this.focusEl, this.resizer, this.dd, this.proxy, this.mask)
				}
				Ext.Window.superclass.beforeDestroy.call(this)
			},
			onDestroy : function () {
				if (this.manager) {
					this.manager.unregister(this)
				}
				Ext.Window.superclass.onDestroy.call(this)
			},
			initTools : function () {
				if (this.minimizable) {
					this.addTool({
							id : "minimize",
							handler : this.minimize.createDelegate(this, [])
						})
				}
				if (this.maximizable) {
					this.addTool({
							id : "maximize",
							handler : this.maximize.createDelegate(this, [])
						});
					this.addTool({
							id : "restore",
							handler : this.restore.createDelegate(this, []),
							hidden : true
						})
				}
				if (this.closable) {
					this.addTool({
							id : "close",
							handler : this[this.closeAction].createDelegate(this, [])
						})
				}
			},
			resizerAction : function () {
				var a = this.proxy.getBox();
				this.proxy.hide();
				this.window.handleResize(a);
				return a
			},
			beforeResize : function () {
				this.resizer.minHeight = Math.max(this.minHeight, this.getFrameHeight() + 40);
				this.resizer.minWidth = Math.max(this.minWidth, this.getFrameWidth() + 40);
				this.resizeBox = this.el.getBox()
			},
			updateHandles : function () {
				if (Ext.isIE && this.resizer) {
					this.resizer.syncHandleHeight();
					this.el.repaint()
				}
			},
			handleResize : function (b) {
				var a = this.resizeBox;
				if (a.x != b.x || a.y != b.y) {
					this.updateBox(b)
				} else {
					this.setSize(b);
					if (Ext.isIE6 && Ext.isStrict) {
						this.doLayout()
					}
				}
				this.focus();
				this.updateHandles();
				this.saveState()
			},
			focus : function () {
				var e = this.focusEl,
				a = this.defaultButton,
				c = typeof a,
				d,
				b;
				if (Ext.isDefined(a)) {
					if (Ext.isNumber(a) && this.fbar) {
						e = this.fbar.items.get(a)
					} else {
						if (Ext.isString(a)) {
							e = Ext.getCmp(a)
						} else {
							e = a
						}
					}
					d = e.getEl();
					b = Ext.getDom(this.container);
					if (d && b) {
						if (b != document.body && !Ext.lib.Region.getRegion(b).contains(Ext.lib.Region.getRegion(d.dom))) {
							return
						}
					}
				}
				e = e || this.focusEl;
				e.focus.defer(10, e)
			},
			setAnimateTarget : function (a) {
				a = Ext.get(a);
				this.animateTarget = a
			},
			beforeShow : function () {
				delete this.el.lastXY;
				delete this.el.lastLT;
				if (this.x === undefined || this.y === undefined) {
					var a = this.el.getAlignToXY(this.container, "c-c");
					var b = this.el.translatePoints(a[0], a[1]);
					this.x = this.x === undefined ? b.left : this.x;
					this.y = this.y === undefined ? b.top : this.y
				}
				this.el.setLeftTop(this.x, this.y);
				if (this.expandOnShow) {
					this.expand(false)
				}
				if (this.modal) {
					Ext.getBody().addClass("x-body-masked");
					this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
					this.mask.show()
				}
			},
			show : function (c, a, b) {
				if (!this.rendered) {
					this.render(Ext.getBody())
				}
				if (this.hidden === false) {
					this.toFront();
					return this
				}
				if (this.fireEvent("beforeshow", this) === false) {
					return this
				}
				if (a) {
					this.on("show", a, b, {
							single : true
						})
				}
				this.hidden = false;
				if (Ext.isDefined(c)) {
					this.setAnimateTarget(c)
				}
				this.beforeShow();
				if (this.animateTarget) {
					this.animShow()
				} else {
					this.afterShow()
				}
				return this
			},
			afterShow : function (b) {
				if (this.isDestroyed) {
					return false
				}
				this.proxy.hide();
				this.el.setStyle("display", "block");
				this.el.show();
				if (this.maximized) {
					this.fitContainer()
				}
				if (Ext.isMac && Ext.isGecko2) {
					this.cascade(this.setAutoScroll)
				}
				if (this.monitorResize || this.modal || this.constrain || this.constrainHeader) {
					Ext.EventManager.onWindowResize(this.onWindowResize, this)
				}
				this.doConstrain();
				this.doLayout();
				if (this.keyMap) {
					this.keyMap.enable()
				}
				this.toFront();
				this.updateHandles();
				if (b && (Ext.isIE || Ext.isWebKit)) {
					var a = this.getSize();
					this.onResize(a.width, a.height)
				}
				this.onShow();
				this.fireEvent("show", this)
			},
			animShow : function () {
				this.proxy.show();
				this.proxy.setBox(this.animateTarget.getBox());
				this.proxy.setOpacity(0);
				var a = this.getBox();
				this.el.setStyle("display", "none");
				this.proxy.shift(Ext.apply(a, {
							callback : this.afterShow.createDelegate(this, [true], false),
							scope : this,
							easing : "easeNone",
							duration : this.showAnimDuration,
							opacity : 0.5
						}))
			},
			hide : function (c, a, b) {
				if (this.hidden || this.fireEvent("beforehide", this) === false) {
					return this
				}
				if (a) {
					this.on("hide", a, b, {
							single : true
						})
				}
				this.hidden = true;
				if (c !== undefined) {
					this.setAnimateTarget(c)
				}
				if (this.modal) {
					this.mask.hide();
					Ext.getBody().removeClass("x-body-masked")
				}
				if (this.animateTarget) {
					this.animHide()
				} else {
					this.el.hide();
					this.afterHide()
				}
				return this
			},
			afterHide : function () {
				this.proxy.hide();
				if (this.monitorResize || this.modal || this.constrain || this.constrainHeader) {
					Ext.EventManager.removeResizeListener(this.onWindowResize, this)
				}
				if (this.keyMap) {
					this.keyMap.disable()
				}
				this.onHide();
				this.fireEvent("hide", this)
			},
			animHide : function () {
				this.proxy.setOpacity(0.5);
				this.proxy.show();
				var a = this.getBox(false);
				this.proxy.setBox(a);
				this.el.hide();
				this.proxy.shift(Ext.apply(this.animateTarget.getBox(), {
							callback : this.afterHide,
							scope : this,
							duration : this.hideAnimDuration,
							easing : "easeNone",
							opacity : 0
						}))
			},
			onShow : Ext.emptyFn,
			onHide : Ext.emptyFn,
			onWindowResize : function () {
				if (this.maximized) {
					this.fitContainer()
				}
				if (this.modal) {
					this.mask.setSize("100%", "100%");
					var a = this.mask.dom.offsetHeight;
					this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true))
				}
				this.doConstrain()
			},
			doConstrain : function () {
				if (this.constrain || this.constrainHeader) {
					var b;
					if (this.constrain) {
						b = {
							right : this.el.shadowOffset,
							left : this.el.shadowOffset,
							bottom : this.el.shadowOffset
						}
					} else {
						var a = this.getSize();
						b = {
							right :  - (a.width - 100),
							bottom :  - (a.height - 25 + this.el.getConstrainOffset())
						}
					}
					var c = this.el.getConstrainToXY(this.container, true, b);
					if (c) {
						this.setPosition(c[0], c[1])
					}
				}
			},
			ghost : function (a) {
				var c = this.createGhost(a);
				var b = this.getBox(true);
				c.setLeftTop(b.x, b.y);
				c.setWidth(b.width);
				this.el.hide();
				this.activeGhost = c;
				return c
			},
			unghost : function (b, a) {
				if (!this.activeGhost) {
					return
				}
				if (b !== false) {
					this.el.show();
					this.focus.defer(10, this);
					if (Ext.isMac && Ext.isGecko2) {
						this.cascade(this.setAutoScroll)
					}
				}
				if (a !== false) {
					this.setPosition(this.activeGhost.getLeft(true), this.activeGhost.getTop(true))
				}
				this.activeGhost.hide();
				this.activeGhost.remove();
				delete this.activeGhost
			},
			minimize : function () {
				this.fireEvent("minimize", this);
				return this
			},
			close : function () {
				if (this.fireEvent("beforeclose", this) !== false) {
					if (this.hidden) {
						this.doClose()
					} else {
						this.hide(null, this.doClose, this)
					}
				}
			},
			doClose : function () {
				this.fireEvent("close", this);
				this.destroy()
			},
			maximize : function () {
				if (!this.maximized) {
					this.expand(false);
					this.restoreSize = this.getSize();
					this.restorePos = this.getPosition(true);
					if (this.maximizable) {
						this.tools.maximize.hide();
						this.tools.restore.show()
					}
					this.maximized = true;
					this.el.disableShadow();
					if (this.dd) {
						this.dd.lock()
					}
					if (this.collapsible) {
						this.tools.toggle.hide()
					}
					this.el.addClass("x-window-maximized");
					this.container.addClass("x-window-maximized-ct");
					this.setPosition(0, 0);
					this.fitContainer();
					this.fireEvent("maximize", this)
				}
				return this
			},
			restore : function () {
				if (this.maximized) {
					var a = this.tools;
					this.el.removeClass("x-window-maximized");
					if (a.restore) {
						a.restore.hide()
					}
					if (a.maximize) {
						a.maximize.show()
					}
					this.setPosition(this.restorePos[0], this.restorePos[1]);
					this.setSize(this.restoreSize.width, this.restoreSize.height);
					delete this.restorePos;
					delete this.restoreSize;
					this.maximized = false;
					this.el.enableShadow(true);
					if (this.dd) {
						this.dd.unlock()
					}
					if (this.collapsible && a.toggle) {
						a.toggle.show()
					}
					this.container.removeClass("x-window-maximized-ct");
					this.doConstrain();
					this.fireEvent("restore", this)
				}
				return this
			},
			toggleMaximize : function () {
				return this[this.maximized ? "restore" : "maximize"]()
			},
			fitContainer : function () {
				var a = this.container.getViewSize(false);
				this.setSize(a.width, a.height)
			},
			setZIndex : function (a) {
				if (this.modal) {
					this.mask.setStyle("z-index", a)
				}
				this.el.setZIndex(++a);
				a += 5;
				if (this.resizer) {
					this.resizer.proxy.setStyle("z-index", ++a)
				}
				this.lastZIndex = a
			},
			alignTo : function (b, a, c) {
				var d = this.el.getAlignToXY(b, a, c);
				this.setPagePosition(d[0], d[1]);
				return this
			},
			anchorTo : function (c, e, d, b) {
				this.clearAnchor();
				this.anchorTarget = {
					el : c,
					alignment : e,
					offsets : d
				};
				Ext.EventManager.onWindowResize(this.doAnchor, this);
				var a = typeof b;
				if (a != "undefined") {
					Ext.EventManager.on(window, "scroll", this.doAnchor, this, {
							buffer : a == "number" ? b : 50
						})
				}
				return this.doAnchor()
			},
			doAnchor : function () {
				var a = this.anchorTarget;
				this.alignTo(a.el, a.alignment, a.offsets);
				return this
			},
			clearAnchor : function () {
				if (this.anchorTarget) {
					Ext.EventManager.removeResizeListener(this.doAnchor, this);
					Ext.EventManager.un(window, "scroll", this.doAnchor, this);
					delete this.anchorTarget
				}
				return this
			},
			toFront : function (a) {
				if (this.manager.bringToFront(this)) {
					if (!a || !a.getTarget().focus) {
						this.focus()
					}
				}
				return this
			},
			setActive : function (a) {
				if (a) {
					if (!this.maximized) {
						this.el.enableShadow(true)
					}
					this.fireEvent("activate", this)
				} else {
					this.el.disableShadow();
					this.fireEvent("deactivate", this)
				}
			},
			toBack : function () {
				this.manager.sendToBack(this);
				return this
			},
			center : function () {
				var a = this.el.getAlignToXY(this.container, "c-c");
				this.setPagePosition(a[0], a[1]);
				return this
			}
		});
Ext.reg("window", Ext.Window);
Ext.Window.DD = Ext.extend(Ext.dd.DD, {
			constructor : function (a) {
				this.win = a;
				Ext.Window.DD.superclass.constructor.call(this, a.el.id, "WindowDD-" + a.id);
				this.setHandleElId(a.header.id);
				this.scroll = false
			},
			moveOnly : true,
			headerOffsets : [100, 25],
			startDrag : function () {
				var a = this.win;
				this.proxy = a.ghost(a.initialConfig.cls);
				if (a.constrain !== false) {
					var c = a.el.shadowOffset;
					this.constrainTo(a.container, {
							right : c,
							left : c,
							bottom : c
						})
				} else {
					if (a.constrainHeader !== false) {
						var b = this.proxy.getSize();
						this.constrainTo(a.container, {
								right :  - (b.width - this.headerOffsets[0]),
								bottom :  - (b.height - this.headerOffsets[1])
							})
					}
				}
			},
			b4Drag : Ext.emptyFn,
			onDrag : function (a) {
				this.alignElWithMouse(this.proxy, a.getPageX(), a.getPageY())
			},
			endDrag : function (a) {
				this.win.unghost();
				this.win.saveState()
			}
		});
Ext.WindowGroup = function () {
	var g = {};
	var d = [];
	var e = null;
	var c = function (j, i) {
		return (!j._lastAccess || j._lastAccess < i._lastAccess) ? -1 : 1
	};
	var h = function () {
		var l = d,
		j = l.length;
		if (j > 0) {
			l.sort(c);
			var k = l[0].manager.zseed;
			for (var m = 0; m < j; m++) {
				var n = l[m];
				if (n && !n.hidden) {
					n.setZIndex(k + (m * 10))
				}
			}
		}
		a()
	};
	var b = function (i) {
		if (i != e) {
			if (e) {
				e.setActive(false)
			}
			e = i;
			if (i) {
				i.setActive(true)
			}
		}
	};
	var a = function () {
		for (var j = d.length - 1; j >= 0; --j) {
			if (!d[j].hidden) {
				b(d[j]);
				return
			}
		}
		b(null)
	};
	return {
		zseed : 9000,
		register : function (i) {
			if (i.manager) {
				i.manager.unregister(i)
			}
			i.manager = this;
			g[i.id] = i;
			d.push(i);
			i.on("hide", a)
		},
		unregister : function (i) {
			delete i.manager;
			delete g[i.id];
			i.un("hide", a);
			d.remove(i)
		},
		get : function (i) {
			return typeof i == "object" ? i : g[i]
		},
		bringToFront : function (i) {
			i = this.get(i);
			if (i != e) {
				i._lastAccess = new Date().getTime();
				h();
				return true
			}
			return false
		},
		sendToBack : function (i) {
			i = this.get(i);
			i._lastAccess =  - (new Date().getTime());
			h();
			return i
		},
		hideAll : function () {
			for (var i in g) {
				if (g[i] && typeof g[i] != "function" && g[i].isVisible()) {
					g[i].hide()
				}
			}
		},
		getActive : function () {
			return e
		},
		getBy : function (l, k) {
			var m = [];
			for (var j = d.length - 1; j >= 0; --j) {
				var n = d[j];
				if (l.call(k || n, n) !== false) {
					m.push(n)
				}
			}
			return m
		},
		each : function (j, i) {
			for (var k in g) {
				if (g[k] && typeof g[k] != "function") {
					if (j.call(i || g[k], g[k]) === false) {
						return
					}
				}
			}
		}
	}
};
Ext.WindowMgr = new Ext.WindowGroup();
Ext.MessageBox = function () {
	var u,
	b,
	q,
	t,
	h,
	l,
	s,
	a,
	n,
	p,
	j,
	g,
	r,
	v,
	o,
	i = "",
	d = "",
	m = ["ok", "yes", "no", "cancel"];
	var c = function (x) {
		r[x].blur();
		if (u.isVisible()) {
			u.hide();
			w();
			Ext.callback(b.fn, b.scope || window, [x, v.dom.value, b], 1)
		}
	};
	var w = function () {
		if (b && b.cls) {
			u.el.removeClass(b.cls)
		}
		n.reset()
	};
	var e = function (z, x, y) {
		if (b && b.closable !== false) {
			u.hide();
			w()
		}
		if (y) {
			y.stopEvent()
		}
	};
	var k = function (x) {
		var z = 0,
		y;
		if (!x) {
			Ext.each(m, function (A) {
					r[A].hide()
				});
			return z
		}
		u.footer.dom.style.display = "";
		Ext.iterate(r, function (A, B) {
				y = x[A];
				if (y) {
					B.show();
					B.setText(Ext.isString(y) ? y : Ext.MessageBox.buttonText[A]);
					z += B.getEl().getWidth() + 15
				} else {
					B.hide()
				}
			});
		return z
	};
	return {
		getDialog : function (x) {
			if (!u) {
				var z = [];
				r = {};
				Ext.each(m, function (A) {
						z.push(r[A] = new Ext.Button({
										text : this.buttonText[A],
										handler : c.createCallback(A),
										hideMode : "offsets"
									}))
					}, this);
				u = new Ext.Window({
							autoCreate : true,
							title : x,
							resizable : false,
							constrain : true,
							constrainHeader : true,
							minimizable : false,
							maximizable : false,
							stateful : false,
							modal : true,
							shim : true,
							buttonAlign : "center",
							width : 400,
							height : 100,
							minHeight : 80,
							plain : true,
							footer : true,
							closable : true,
							close : function () {
								if (b && b.buttons && b.buttons.no && !b.buttons.cancel) {
									c("no")
								} else {
									c("cancel")
								}
							},
							fbar : new Ext.Toolbar({
									items : z,
									enableOverflow : false
								})
						});
				u.render(document.body);
				u.getEl().addClass("x-window-dlg");
				q = u.mask;
				h = u.body.createChild({
							html : '<div class="ext-mb-icon"></div><div class="ext-mb-content"><span class="ext-mb-text"></span><br /><div class="ext-mb-fix-cursor"><input type="text" class="ext-mb-input" /><textarea class="ext-mb-textarea"></textarea></div></div>'
						});
				j = Ext.get(h.dom.firstChild);
				var y = h.dom.childNodes[1];
				l = Ext.get(y.firstChild);
				s = Ext.get(y.childNodes[2].firstChild);
				s.enableDisplayMode();
				s.addKeyListener([10, 13], function () {
						if (u.isVisible() && b && b.buttons) {
							if (b.buttons.ok) {
								c("ok")
							} else {
								if (b.buttons.yes) {
									c("yes")
								}
							}
						}
					});
				a = Ext.get(y.childNodes[2].childNodes[1]);
				a.enableDisplayMode();
				n = new Ext.ProgressBar({
							renderTo : h
						});
				h.createChild({
						cls : "x-clear"
					})
			}
			return u
		},
		updateText : function (A) {
			if (!u.isVisible() && !b.width) {
				u.setSize(this.maxWidth, 100)
			}
			l.update(A ? A + " " : "&#160;");
			var y = d != "" ? (j.getWidth() + j.getMargins("lr")) : 0,
			C = l.getWidth() + l.getMargins("lr"),
			z = u.getFrameWidth("lr"),
			B = u.body.getFrameWidth("lr"),
			x;
			x = Math.max(Math.min(b.width || y + C + z + B, b.maxWidth || this.maxWidth), Math.max(b.minWidth || this.minWidth, o || 0));
			if (b.prompt === true) {
				v.setWidth(x - y - z - B)
			}
			if (b.progress === true || b.wait === true) {
				n.setSize(x - y - z - B)
			}
			if (Ext.isIE && x == o) {
				x += 4
			}
			l.update(A || "&#160;");
			u.setSize(x, "auto").center();
			return this
		},
		updateProgress : function (y, x, z) {
			n.updateProgress(y, x);
			if (z) {
				this.updateText(z)
			}
			return this
		},
		isVisible : function () {
			return u && u.isVisible()
		},
		hide : function () {
			var x = u ? u.activeGhost : null;
			if (this.isVisible() || x) {
				u.hide();
				w();
				if (x) {
					u.unghost(false, false)
				}
			}
			return this
		},
		show : function (A) {
			if (this.isVisible()) {
				this.hide()
			}
			b = A;
			var B = this.getDialog(b.title || "&#160;");
			B.setTitle(b.title || "&#160;");
			var x = (b.closable !== false && b.progress !== true && b.wait !== true);
			B.tools.close.setDisplayed(x);
			v = s;
			b.prompt = b.prompt || (b.multiline ? true : false);
			if (b.prompt) {
				if (b.multiline) {
					s.hide();
					a.show();
					a.setHeight(Ext.isNumber(b.multiline) ? b.multiline : this.defaultTextHeight);
					v = a
				} else {
					s.show();
					a.hide()
				}
			} else {
				s.hide();
				a.hide()
			}
			v.dom.value = b.value || "";
			if (b.prompt) {
				B.focusEl = v
			} else {
				var z = b.buttons;
				var y = null;
				if (z && z.ok) {
					y = r.ok
				} else {
					if (z && z.yes) {
						y = r.yes
					}
				}
				if (y) {
					B.focusEl = y
				}
			}
			if (Ext.isDefined(b.iconCls)) {
				B.setIconClass(b.iconCls)
			}
			this.setIcon(Ext.isDefined(b.icon) ? b.icon : i);
			o = k(b.buttons);
			n.setVisible(b.progress === true || b.wait === true);
			this.updateProgress(0, b.progressText);
			this.updateText(b.msg);
			if (b.cls) {
				B.el.addClass(b.cls)
			}
			B.proxyDrag = b.proxyDrag === true;
			B.modal = b.modal !== false;
			B.mask = b.modal !== false ? q : false;
			if (!B.isVisible()) {
				document.body.appendChild(u.el.dom);
				B.setAnimateTarget(b.animEl);
				B.on("show", function () {
						if (x === true) {
							B.keyMap.enable()
						} else {
							B.keyMap.disable()
						}
					}, this, {
						single : true
					});
				B.show(b.animEl)
			}
			if (b.wait === true) {
				n.wait(b.waitConfig)
			}
			return this
		},
		setIcon : function (x) {
			if (!u) {
				i = x;
				return
			}
			i = undefined;
			if (x && x != "") {
				j.removeClass("x-hidden");
				j.replaceClass(d, x);
				h.addClass("x-dlg-icon");
				d = x
			} else {
				j.replaceClass(d, "x-hidden");
				h.removeClass("x-dlg-icon");
				d = ""
			}
			return this
		},
		progress : function (z, y, x) {
			this.show({
					title : z,
					msg : y,
					buttons : false,
					progress : true,
					closable : false,
					minWidth : this.minProgressWidth,
					progressText : x
				});
			return this
		},
		wait : function (z, y, x) {
			this.show({
					title : y,
					msg : z,
					buttons : false,
					closable : false,
					wait : true,
					modal : true,
					minWidth : this.minProgressWidth,
					waitConfig : x
				});
			return this
		},
		alert : function (A, z, y, x) {
			this.show({
					title : A,
					msg : z,
					buttons : this.OK,
					fn : y,
					scope : x,
					minWidth : this.minWidth
				});
			return this
		},
		confirm : function (A, z, y, x) {
			this.show({
					title : A,
					msg : z,
					buttons : this.YESNO,
					fn : y,
					scope : x,
					icon : this.QUESTION,
					minWidth : this.minWidth
				});
			return this
		},
		prompt : function (C, B, z, y, x, A) {
			this.show({
					title : C,
					msg : B,
					buttons : this.OKCANCEL,
					fn : z,
					minWidth : this.minPromptWidth,
					scope : y,
					prompt : true,
					multiline : x,
					value : A
				});
			return this
		},
		OK : {
			ok : true
		},
		CANCEL : {
			cancel : true
		},
		OKCANCEL : {
			ok : true,
			cancel : true
		},
		YESNO : {
			yes : true,
			no : true
		},
		YESNOCANCEL : {
			yes : true,
			no : true,
			cancel : true
		},
		INFO : "ext-mb-info",
		WARNING : "ext-mb-warning",
		QUESTION : "ext-mb-question",
		ERROR : "ext-mb-error",
		defaultTextHeight : 75,
		maxWidth : 600,
		minWidth : 100,
		minProgressWidth : 250,
		minPromptWidth : 250,
		buttonText : {
			ok : "OK",
			cancel : "Cancel",
			yes : "Yes",
			no : "No"
		}
	}
}
();
Ext.Msg = Ext.MessageBox;
Ext.dd.PanelProxy = Ext.extend(Object, {
			constructor : function (a, b) {
				this.panel = a;
				this.id = this.panel.id + "-ddproxy";
				Ext.apply(this, b)
			},
			insertProxy : true,
			setStatus : Ext.emptyFn,
			reset : Ext.emptyFn,
			update : Ext.emptyFn,
			stop : Ext.emptyFn,
			sync : Ext.emptyFn,
			getEl : function () {
				return this.ghost
			},
			getGhost : function () {
				return this.ghost
			},
			getProxy : function () {
				return this.proxy
			},
			hide : function () {
				if (this.ghost) {
					if (this.proxy) {
						this.proxy.remove();
						delete this.proxy
					}
					this.panel.el.dom.style.display = "";
					this.ghost.remove();
					delete this.ghost
				}
			},
			show : function () {
				if (!this.ghost) {
					this.ghost = this.panel.createGhost(this.panel.initialConfig.cls, undefined, Ext.getBody());
					this.ghost.setXY(this.panel.el.getXY());
					if (this.insertProxy) {
						this.proxy = this.panel.el.insertSibling({
									cls : "x-panel-dd-spacer"
								});
						this.proxy.setSize(this.panel.getSize())
					}
					this.panel.el.dom.style.display = "none"
				}
			},
			repair : function (b, c, a) {
				this.hide();
				if (typeof c == "function") {
					c.call(a || this)
				}
			},
			moveProxy : function (a, b) {
				if (this.proxy) {
					a.insertBefore(this.proxy.dom, b)
				}
			}
		});
Ext.Panel.DD = Ext.extend(Ext.dd.DragSource, {
			constructor : function (b, a) {
				this.panel = b;
				this.dragData = {
					panel : b
				};
				this.proxy = new Ext.dd.PanelProxy(b, a);
				Ext.Panel.DD.superclass.constructor.call(this, b.el, a);
				var d = b.header,
				c = b.body;
				if (d) {
					this.setHandleElId(d.id);
					c = b.header
				}
				c.setStyle("cursor", "move");
				this.scroll = false
			},
			showFrame : Ext.emptyFn,
			startDrag : Ext.emptyFn,
			b4StartDrag : function (a, b) {
				this.proxy.show()
			},
			b4MouseDown : function (b) {
				var a = b.getPageX(),
				c = b.getPageY();
				this.autoOffset(a, c)
			},
			onInitDrag : function (a, b) {
				this.onStartDrag(a, b);
				return true
			},
			createFrame : Ext.emptyFn,
			getDragEl : function (a) {
				return this.proxy.ghost.dom
			},
			endDrag : function (a) {
				this.proxy.hide();
				this.panel.saveState()
			},
			autoOffset : function (a, b) {
				a -= this.startPageX;
				b -= this.startPageY;
				this.setDelta(a, b)
			}
		});
Ext.state.Provider = Ext.extend(Ext.util.Observable, {
			constructor : function () {
				this.addEvents("statechange");
				this.state = {};
				Ext.state.Provider.superclass.constructor.call(this)
			},
			get : function (b, a) {
				return typeof this.state[b] == "undefined" ? a : this.state[b]
			},
			clear : function (a) {
				delete this.state[a];
				this.fireEvent("statechange", this, a, null)
			},
			set : function (a, b) {
				this.state[a] = b;
				this.fireEvent("statechange", this, a, b)
			},
			decodeValue : function (b) {
				var e = /^(a|n|d|b|s|o|e)\:(.*)$/,
				h = e.exec(unescape(b)),
				d,
				c,
				a,
				g;
				if (!h || !h[1]) {
					return
				}
				c = h[1];
				a = h[2];
				switch (c) {
				case "e":
					return null;
				case "n":
					return parseFloat(a);
				case "d":
					return new Date(Date.parse(a));
				case "b":
					return (a == "1");
				case "a":
					d = [];
					if (a != "") {
						Ext.each(a.split("^"), function (i) {
								d.push(this.decodeValue(i))
							}, this)
					}
					return d;
				case "o":
					d = {};
					if (a != "") {
						Ext.each(a.split("^"), function (i) {
								g = i.split("=");
								d[g[0]] = this.decodeValue(g[1])
							}, this)
					}
					return d;
				default:
					return a
				}
			},
			encodeValue : function (c) {
				var b,
				g = "",
				e = 0,
				a,
				d;
				if (c == null) {
					return "e:1"
				} else {
					if (typeof c == "number") {
						b = "n:" + c
					} else {
						if (typeof c == "boolean") {
							b = "b:" + (c ? "1" : "0")
						} else {
							if (Ext.isDate(c)) {
								b = "d:" + c.toGMTString()
							} else {
								if (Ext.isArray(c)) {
									for (a = c.length; e < a; e++) {
										g += this.encodeValue(c[e]);
										if (e != a - 1) {
											g += "^"
										}
									}
									b = "a:" + g
								} else {
									if (typeof c == "object") {
										for (d in c) {
											if (typeof c[d] != "function" && c[d] !== undefined) {
												g += d + "=" + this.encodeValue(c[d]) + "^"
											}
										}
										b = "o:" + g.substring(0, g.length - 1)
									} else {
										b = "s:" + c
									}
								}
							}
						}
					}
				}
				return escape(b)
			}
		});
Ext.state.Manager = function () {
	var a = new Ext.state.Provider();
	return {
		setProvider : function (b) {
			a = b
		},
		get : function (c, b) {
			return a.get(c, b)
		},
		set : function (b, c) {
			a.set(b, c)
		},
		clear : function (b) {
			a.clear(b)
		},
		getProvider : function () {
			return a
		}
	}
}
();
Ext.state.CookieProvider = Ext.extend(Ext.state.Provider, {
			constructor : function (a) {
				Ext.state.CookieProvider.superclass.constructor.call(this);
				this.path = "/";
				this.expires = new Date(new Date().getTime() + (1000 * 60 * 60 * 24 * 7));
				this.domain = null;
				this.secure = false;
				Ext.apply(this, a);
				this.state = this.readCookies()
			},
			set : function (a, b) {
				if (typeof b == "undefined" || b === null) {
					this.clear(a);
					return
				}
				this.setCookie(a, b);
				Ext.state.CookieProvider.superclass.set.call(this, a, b)
			},
			clear : function (a) {
				this.clearCookie(a);
				Ext.state.CookieProvider.superclass.clear.call(this, a)
			},
			readCookies : function () {
				var d = {},
				h = document.cookie + ";",
				b = /\s?(.*?)=(.*?);/g,
				g,
				a,
				e;
				while ((g = b.exec(h)) != null) {
					a = g[1];
					e = g[2];
					if (a && a.substring(0, 3) == "ys-") {
						d[a.substr(3)] = this.decodeValue(e)
					}
				}
				return d
			},
			setCookie : function (a, b) {
				document.cookie = "ys-" + a + "=" + this.encodeValue(b) + ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) + ((this.path == null) ? "" : ("; path=" + this.path)) + ((this.domain == null) ? "" : ("; domain=" + this.domain)) + ((this.secure == true) ? "; secure" : "")
			},
			clearCookie : function (a) {
				document.cookie = "ys-" + a + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" + ((this.path == null) ? "" : ("; path=" + this.path)) + ((this.domain == null) ? "" : ("; domain=" + this.domain)) + ((this.secure == true) ? "; secure" : "")
			}
		});
Ext.DataView = Ext.extend(Ext.BoxComponent, {
			selectedClass : "x-view-selected",
			emptyText : "",
			deferEmptyText : true,
			trackOver : false,
			blockRefresh : false,
			last : false,
			initComponent : function () {
				Ext.DataView.superclass.initComponent.call(this);
				if (Ext.isString(this.tpl) || Ext.isArray(this.tpl)) {
					this.tpl = new Ext.XTemplate(this.tpl)
				}
				this.addEvents("beforeclick", "click", "mouseenter", "mouseleave", "containerclick", "dblclick", "contextmenu", "containercontextmenu", "selectionchange", "beforeselect");
				this.store = Ext.StoreMgr.lookup(this.store);
				this.all = new Ext.CompositeElementLite();
				this.selected = new Ext.CompositeElementLite()
			},
			afterRender : function () {
				Ext.DataView.superclass.afterRender.call(this);
				this.mon(this.getTemplateTarget(), {
						click : this.onClick,
						dblclick : this.onDblClick,
						contextmenu : this.onContextMenu,
						scope : this
					});
				if (this.overClass || this.trackOver) {
					this.mon(this.getTemplateTarget(), {
							mouseover : this.onMouseOver,
							mouseout : this.onMouseOut,
							scope : this
						})
				}
				if (this.store) {
					this.bindStore(this.store, true)
				}
			},
			refresh : function () {
				this.clearSelections(false, true);
				var b = this.getTemplateTarget(),
				a = this.store.getRange();
				b.update("");
				if (a.length < 1) {
					if (!this.deferEmptyText || this.hasSkippedEmptyText) {
						b.update(this.emptyText)
					}
					this.all.clear()
				} else {
					this.tpl.overwrite(b, this.collectData(a, 0));
					this.all.fill(Ext.query(this.itemSelector, b.dom));
					this.updateIndexes(0)
				}
				this.hasSkippedEmptyText = true
			},
			getTemplateTarget : function () {
				return this.el
			},
			prepareData : function (a) {
				return a
			},
			collectData : function (b, e) {
				var d = [],
				c = 0,
				a = b.length;
				for (; c < a; c++) {
					d[d.length] = this.prepareData(b[c].data, e + c, b[c])
				}
				return d
			},
			bufferRender : function (a, b) {
				var c = document.createElement("div");
				this.tpl.overwrite(c, this.collectData(a, b));
				return Ext.query(this.itemSelector, c)
			},
			onUpdate : function (g, a) {
				var b = this.store.indexOf(a);
				if (b > -1) {
					var e = this.isSelected(b),
					c = this.all.elements[b],
					d = this.bufferRender([a], b)[0];
					this.all.replaceElement(b, d, true);
					if (e) {
						this.selected.replaceElement(c, d);
						this.all.item(b).addClass(this.selectedClass)
					}
					this.updateIndexes(b, b)
				}
			},
			onAdd : function (g, d, e) {
				if (this.all.getCount() === 0) {
					this.refresh();
					return
				}
				var c = this.bufferRender(d, e),
				h,
				b = this.all.elements;
				if (e < this.all.getCount()) {
					h = this.all.item(e).insertSibling(c, "before", true);
					b.splice.apply(b, [e, 0].concat(c))
				} else {
					h = this.all.last().insertSibling(c, "after", true);
					b.push.apply(b, c)
				}
				this.updateIndexes(e)
			},
			onRemove : function (c, a, b) {
				this.deselect(b);
				this.all.removeElement(b, true);
				this.updateIndexes(b);
				if (this.store.getCount() === 0) {
					this.refresh()
				}
			},
			refreshNode : function (a) {
				this.onUpdate(this.store, this.store.getAt(a))
			},
			updateIndexes : function (d, c) {
				var b = this.all.elements;
				d = d || 0;
				c = c || ((c === 0) ? 0 : (b.length - 1));
				for (var a = d; a <= c; a++) {
					b[a].viewIndex = a
				}
			},
			getStore : function () {
				return this.store
			},
			bindStore : function (a, b) {
				if (!b && this.store) {
					if (a !== this.store && this.store.autoDestroy) {
						this.store.destroy()
					} else {
						this.store.un("beforeload", this.onBeforeLoad, this);
						this.store.un("datachanged", this.onDataChanged, this);
						this.store.un("add", this.onAdd, this);
						this.store.un("remove", this.onRemove, this);
						this.store.un("update", this.onUpdate, this);
						this.store.un("clear", this.refresh, this)
					}
					if (!a) {
						this.store = null
					}
				}
				if (a) {
					a = Ext.StoreMgr.lookup(a);
					a.on({
							scope : this,
							beforeload : this.onBeforeLoad,
							datachanged : this.onDataChanged,
							add : this.onAdd,
							remove : this.onRemove,
							update : this.onUpdate,
							clear : this.refresh
						})
				}
				this.store = a;
				if (a) {
					this.refresh()
				}
			},
			onDataChanged : function () {
				if (this.blockRefresh !== true) {
					this.refresh.apply(this, arguments)
				}
			},
			findItemFromChild : function (a) {
				return Ext.fly(a).findParent(this.itemSelector, this.getTemplateTarget())
			},
			onClick : function (c) {
				var b = c.getTarget(this.itemSelector, this.getTemplateTarget()),
				a;
				if (b) {
					a = this.indexOf(b);
					if (this.onItemClick(b, a, c) !== false) {
						this.fireEvent("click", this, a, b, c)
					}
				} else {
					if (this.fireEvent("containerclick", this, c) !== false) {
						this.onContainerClick(c)
					}
				}
			},
			onContainerClick : function (a) {
				this.clearSelections()
			},
			onContextMenu : function (b) {
				var a = b.getTarget(this.itemSelector, this.getTemplateTarget());
				if (a) {
					this.fireEvent("contextmenu", this, this.indexOf(a), a, b)
				} else {
					this.fireEvent("containercontextmenu", this, b)
				}
			},
			onDblClick : function (b) {
				var a = b.getTarget(this.itemSelector, this.getTemplateTarget());
				if (a) {
					this.fireEvent("dblclick", this, this.indexOf(a), a, b)
				}
			},
			onMouseOver : function (b) {
				var a = b.getTarget(this.itemSelector, this.getTemplateTarget());
				if (a && a !== this.lastItem) {
					this.lastItem = a;
					Ext.fly(a).addClass(this.overClass);
					this.fireEvent("mouseenter", this, this.indexOf(a), a, b)
				}
			},
			onMouseOut : function (a) {
				if (this.lastItem) {
					if (!a.within(this.lastItem, true, true)) {
						Ext.fly(this.lastItem).removeClass(this.overClass);
						this.fireEvent("mouseleave", this, this.indexOf(this.lastItem), this.lastItem, a);
						delete this.lastItem
					}
				}
			},
			onItemClick : function (b, a, c) {
				if (this.fireEvent("beforeclick", this, a, b, c) === false) {
					return false
				}
				if (this.multiSelect) {
					this.doMultiSelection(b, a, c);
					c.preventDefault()
				} else {
					if (this.singleSelect) {
						this.doSingleSelection(b, a, c);
						c.preventDefault()
					}
				}
				return true
			},
			doSingleSelection : function (b, a, c) {
				if (c.ctrlKey && this.isSelected(a)) {
					this.deselect(a)
				} else {
					this.select(a, false)
				}
			},
			doMultiSelection : function (c, a, d) {
				if (d.shiftKey && this.last !== false) {
					var b = this.last;
					this.selectRange(b, a, d.ctrlKey);
					this.last = b
				} else {
					if ((d.ctrlKey || this.simpleSelect) && this.isSelected(a)) {
						this.deselect(a)
					} else {
						this.select(a, d.ctrlKey || d.shiftKey || this.simpleSelect)
					}
				}
			},
			getSelectionCount : function () {
				return this.selected.getCount()
			},
			getSelectedNodes : function () {
				return this.selected.elements
			},
			getSelectedIndexes : function () {
				var b = [],
				d = this.selected.elements,
				c = 0,
				a = d.length;
				for (; c < a; c++) {
					b.push(d[c].viewIndex)
				}
				return b
			},
			getSelectedRecords : function () {
				return this.getRecords(this.selected.elements)
			},
			getRecords : function (c) {
				var b = [],
				d = 0,
				a = c.length;
				for (; d < a; d++) {
					b[b.length] = this.store.getAt(c[d].viewIndex)
				}
				return b
			},
			getRecord : function (a) {
				return this.store.getAt(a.viewIndex)
			},
			clearSelections : function (a, b) {
				if ((this.multiSelect || this.singleSelect) && this.selected.getCount() > 0) {
					if (!b) {
						this.selected.removeClass(this.selectedClass)
					}
					this.selected.clear();
					this.last = false;
					if (!a) {
						this.fireEvent("selectionchange", this, this.selected.elements)
					}
				}
			},
			isSelected : function (a) {
				return this.selected.contains(this.getNode(a))
			},
			deselect : function (a) {
				if (this.isSelected(a)) {
					a = this.getNode(a);
					this.selected.removeElement(a);
					if (this.last == a.viewIndex) {
						this.last = false
					}
					Ext.fly(a).removeClass(this.selectedClass);
					this.fireEvent("selectionchange", this, this.selected.elements)
				}
			},
			select : function (d, g, b) {
				if (Ext.isArray(d)) {
					if (!g) {
						this.clearSelections(true)
					}
					for (var c = 0, a = d.length; c < a; c++) {
						this.select(d[c], true, true)
					}
					if (!b) {
						this.fireEvent("selectionchange", this, this.selected.elements)
					}
				} else {
					var e = this.getNode(d);
					if (!g) {
						this.clearSelections(true)
					}
					if (e && !this.isSelected(e)) {
						if (this.fireEvent("beforeselect", this, e, this.selected.elements) !== false) {
							Ext.fly(e).addClass(this.selectedClass);
							this.selected.add(e);
							this.last = e.viewIndex;
							if (!b) {
								this.fireEvent("selectionchange", this, this.selected.elements)
							}
						}
					}
				}
			},
			selectRange : function (c, a, b) {
				if (!b) {
					this.clearSelections(true)
				}
				this.select(this.getNodes(c, a), true)
			},
			getNode : function (b) {
				if (Ext.isString(b)) {
					return document.getElementById(b)
				} else {
					if (Ext.isNumber(b)) {
						return this.all.elements[b]
					} else {
						if (b instanceof Ext.data.Record) {
							var a = this.store.indexOf(b);
							return this.all.elements[a]
						}
					}
				}
				return b
			},
			getNodes : function (e, a) {
				var d = this.all.elements,
				b = [],
				c;
				e = e || 0;
				a = !Ext.isDefined(a) ? Math.max(d.length - 1, 0) : a;
				if (e <= a) {
					for (c = e; c <= a && d[c]; c++) {
						b.push(d[c])
					}
				} else {
					for (c = e; c >= a && d[c]; c--) {
						b.push(d[c])
					}
				}
				return b
			},
			indexOf : function (a) {
				a = this.getNode(a);
				if (Ext.isNumber(a.viewIndex)) {
					return a.viewIndex
				}
				return this.all.indexOf(a)
			},
			onBeforeLoad : function () {
				if (this.loadingText) {
					this.clearSelections(false, true);
					this.getTemplateTarget().update('<div class="loading-indicator">' + this.loadingText + "</div>");
					this.all.clear()
				}
			},
			onDestroy : function () {
				this.all.clear();
				this.selected.clear();
				Ext.DataView.superclass.onDestroy.call(this);
				this.bindStore(null)
			}
		});
Ext.DataView.prototype.setStore = Ext.DataView.prototype.bindStore;
Ext.reg("dataview", Ext.DataView);
Ext.list.ListView = Ext.extend(Ext.DataView, {
			itemSelector : "dl",
			selectedClass : "x-list-selected",
			overClass : "x-list-over",
			scrollOffset : undefined,
			columnResize : true,
			columnSort : true,
			maxColumnWidth : Ext.isIE ? 99 : 100,
			initComponent : function () {
				if (this.columnResize) {
					this.colResizer = new Ext.list.ColumnResizer(this.colResizer);
					this.colResizer.init(this)
				}
				if (this.columnSort) {
					this.colSorter = new Ext.list.Sorter(this.columnSort);
					this.colSorter.init(this)
				}
				if (!this.internalTpl) {
					this.internalTpl = new Ext.XTemplate('<div class="x-list-header"><div class="x-list-header-inner">', '<tpl for="columns">', '<div style="width:{[values.width*100]}%;text-align:{align};"><em unselectable="on" id="', this.id, '-xlhd-{#}">', "{header}", "</em></div>", "</tpl>", '<div class="x-clear"></div>', "</div></div>", '<div class="x-list-body"><div class="x-list-body-inner">', "</div></div>")
				}
				if (!this.tpl) {
					this.tpl = new Ext.XTemplate('<tpl for="rows">', "<dl>", '<tpl for="parent.columns">', '<dt style="width:{[values.width*100]}%;text-align:{align};">', '<em unselectable="on"<tpl if="cls"> class="{cls}</tpl>">', "{[values.tpl.apply(parent)]}", "</em></dt>", "</tpl>", '<div class="x-clear"></div>', "</dl>", "</tpl>")
				}
				var l = this.columns,
				h = 0,
				k = 0,
				m = l.length,
				b = [];
				for (var g = 0; g < m; g++) {
					var n = l[g];
					if (!n.isColumn) {
						n.xtype = n.xtype ? (/^lv/.test(n.xtype) ? n.xtype : "lv" + n.xtype) : "lvcolumn";
						n = Ext.create(n)
					}
					if (n.width) {
						h += n.width * 100;
						if (h > this.maxColumnWidth) {
							n.width -= (h - this.maxColumnWidth) / 100
						}
						k++
					}
					b.push(n)
				}
				l = this.columns = b;
				if (k < m) {
					var d = m - k;
					if (h < this.maxColumnWidth) {
						var a = ((this.maxColumnWidth - h) / d) / 100;
						for (var e = 0; e < m; e++) {
							var n = l[e];
							if (!n.width) {
								n.width = a
							}
						}
					}
				}
				Ext.list.ListView.superclass.initComponent.call(this)
			},
			onRender : function () {
				this.autoEl = {
					cls : "x-list-wrap"
				};
				Ext.list.ListView.superclass.onRender.apply(this, arguments);
				this.internalTpl.overwrite(this.el, {
						columns : this.columns
					});
				this.innerBody = Ext.get(this.el.dom.childNodes[1].firstChild);
				this.innerHd = Ext.get(this.el.dom.firstChild.firstChild);
				if (this.hideHeaders) {
					this.el.dom.firstChild.style.display = "none"
				}
			},
			getTemplateTarget : function () {
				return this.innerBody
			},
			collectData : function () {
				var a = Ext.list.ListView.superclass.collectData.apply(this, arguments);
				return {
					columns : this.columns,
					rows : a
				}
			},
			verifyInternalSize : function () {
				if (this.lastSize) {
					this.onResize(this.lastSize.width, this.lastSize.height)
				}
			},
			onResize : function (c, e) {
				var b = this.innerBody.dom,
				g = this.innerHd.dom,
				d = c - Ext.num(this.scrollOffset, Ext.getScrollBarWidth()) + "px",
				a;
				if (!b) {
					return
				}
				a = b.parentNode;
				if (Ext.isNumber(c)) {
					if (this.reserveScrollOffset || ((a.offsetWidth - a.clientWidth) > 10)) {
						b.style.width = d;
						g.style.width = d
					} else {
						b.style.width = c + "px";
						g.style.width = c + "px";
						setTimeout(function () {
								if ((a.offsetWidth - a.clientWidth) > 10) {
									b.style.width = d;
									g.style.width = d
								}
							}, 10)
					}
				}
				if (Ext.isNumber(e)) {
					a.style.height = Math.max(0, e - g.parentNode.offsetHeight) + "px"
				}
			},
			updateIndexes : function () {
				Ext.list.ListView.superclass.updateIndexes.apply(this, arguments);
				this.verifyInternalSize()
			},
			findHeaderIndex : function (g) {
				g = g.dom || g;
				var a = g.parentNode,
				d = a.parentNode.childNodes,
				b = 0,
				e;
				for (; e = d[b]; b++) {
					if (e == a) {
						return b
					}
				}
				return -1
			},
			setHdWidths : function () {
				var d = this.innerHd.dom.getElementsByTagName("div"),
				c = 0,
				b = this.columns,
				a = b.length;
				for (; c < a; c++) {
					d[c].style.width = (b[c].width * 100) + "%"
				}
			}
		});
Ext.reg("listview", Ext.list.ListView);
Ext.ListView = Ext.list.ListView;
Ext.list.Column = Ext.extend(Object, {
			isColumn : true,
			align : "left",
			header : "",
			width : null,
			cls : "",
			constructor : function (a) {
				if (!a.tpl) {
					a.tpl = new Ext.XTemplate("{" + a.dataIndex + "}")
				} else {
					if (Ext.isString(a.tpl)) {
						a.tpl = new Ext.XTemplate(a.tpl)
					}
				}
				Ext.apply(this, a)
			}
		});
Ext.reg("lvcolumn", Ext.list.Column);
Ext.list.NumberColumn = Ext.extend(Ext.list.Column, {
			format : "0,000.00",
			constructor : function (a) {
				a.tpl = a.tpl || new Ext.XTemplate("{" + a.dataIndex + ':number("' + (a.format || this.format) + '")}');
				Ext.list.NumberColumn.superclass.constructor.call(this, a)
			}
		});
Ext.reg("lvnumbercolumn", Ext.list.NumberColumn);
Ext.list.DateColumn = Ext.extend(Ext.list.Column, {
			format : "m/d/Y",
			constructor : function (a) {
				a.tpl = a.tpl || new Ext.XTemplate("{" + a.dataIndex + ':date("' + (a.format || this.format) + '")}');
				Ext.list.DateColumn.superclass.constructor.call(this, a)
			}
		});
Ext.reg("lvdatecolumn", Ext.list.DateColumn);
Ext.list.BooleanColumn = Ext.extend(Ext.list.Column, {
			trueText : "true",
			falseText : "false",
			undefinedText : "&#160;",
			constructor : function (e) {
				e.tpl = e.tpl || new Ext.XTemplate("{" + e.dataIndex + ":this.format}");
				var b = this.trueText,
				d = this.falseText,
				a = this.undefinedText;
				e.tpl.format = function (c) {
					if (c === undefined) {
						return a
					}
					if (!c || c === "false") {
						return d
					}
					return b
				};
				Ext.list.DateColumn.superclass.constructor.call(this, e)
			}
		});
Ext.reg("lvbooleancolumn", Ext.list.BooleanColumn);
Ext.list.ColumnResizer = Ext.extend(Ext.util.Observable, {
			minPct : 0.05,
			constructor : function (a) {
				Ext.apply(this, a);
				Ext.list.ColumnResizer.superclass.constructor.call(this)
			},
			init : function (a) {
				this.view = a;
				a.on("render", this.initEvents, this)
			},
			initEvents : function (a) {
				a.mon(a.innerHd, "mousemove", this.handleHdMove, this);
				this.tracker = new Ext.dd.DragTracker({
							onBeforeStart : this.onBeforeStart.createDelegate(this),
							onStart : this.onStart.createDelegate(this),
							onDrag : this.onDrag.createDelegate(this),
							onEnd : this.onEnd.createDelegate(this),
							tolerance : 3,
							autoStart : 300
						});
				this.tracker.initEl(a.innerHd);
				a.on("beforedestroy", this.tracker.destroy, this.tracker)
			},
			handleHdMove : function (i, d) {
				var c = 5,
				b = i.getPageX(),
				j = i.getTarget("em", 3, true);
				if (j) {
					var h = j.getRegion(),
					g = j.dom.style,
					a = j.dom.parentNode;
					if (b - h.left <= c && a != a.parentNode.firstChild) {
						this.activeHd = Ext.get(a.previousSibling.firstChild);
						g.cursor = Ext.isWebKit ? "e-resize" : "col-resize"
					} else {
						if (h.right - b <= c && a != a.parentNode.lastChild.previousSibling) {
							this.activeHd = j;
							g.cursor = Ext.isWebKit ? "w-resize" : "col-resize"
						} else {
							delete this.activeHd;
							g.cursor = ""
						}
					}
				}
			},
			onBeforeStart : function (a) {
				this.dragHd = this.activeHd;
				return !!this.dragHd
			},
			onStart : function (g) {
				var d = this,
				b = d.view,
				c = d.dragHd,
				a = d.tracker.getXY()[0];
				d.proxy = b.el.createChild({
							cls : "x-list-resizer"
						});
				d.dragX = c.getX();
				d.headerIndex = b.findHeaderIndex(c);
				d.headersDisabled = b.disableHeaders;
				b.disableHeaders = true;
				d.proxy.setHeight(b.el.getHeight());
				d.proxy.setX(d.dragX);
				d.proxy.setWidth(a - d.dragX);
				this.setBoundaries()
			},
			setBoundaries : function (j) {
				var k = this.view,
				h = this.headerIndex,
				c = k.innerHd.getWidth(),
				j = k.innerHd.getX(),
				b = Math.ceil(c * this.minPct),
				l = c - b,
				e = k.columns.length,
				d = k.innerHd.select("em", true),
				g = b + j,
				a = l + j,
				i;
				if (e == 2) {
					this.minX = g;
					this.maxX = a
				} else {
					i = d.item(h + 2);
					this.minX = d.item(h).getX() + b;
					this.maxX = i ? i.getX() - b : a;
					if (h == 0) {
						this.minX = g
					} else {
						if (h == e - 2) {
							this.maxX = a
						}
					}
				}
			},
			onDrag : function (c) {
				var b = this,
				a = b.tracker.getXY()[0].constrain(b.minX, b.maxX);
				b.proxy.setWidth(a - this.dragX)
			},
			onEnd : function (i) {
				var g = this.proxy.getWidth(),
				h = this.headerIndex,
				l = this.view,
				c = l.columns,
				b = l.innerHd.getWidth(),
				k = Math.ceil(g * l.maxColumnWidth / b) / 100,
				d = this.headersDisabled,
				m = c[h],
				j = c[h + 1],
				a = m.width + j.width;
				this.proxy.remove();
				m.width = k;
				j.width = a - k;
				delete this.dragHd;
				l.setHdWidths();
				l.refresh();
				setTimeout(function () {
						l.disableHeaders = d
					}, 100)
			}
		});
Ext.ListView.ColumnResizer = Ext.list.ColumnResizer;
Ext.list.Sorter = Ext.extend(Ext.util.Observable, {
			sortClasses : ["sort-asc", "sort-desc"],
			constructor : function (a) {
				Ext.apply(this, a);
				Ext.list.Sorter.superclass.constructor.call(this)
			},
			init : function (a) {
				this.view = a;
				a.on("render", this.initEvents, this)
			},
			initEvents : function (a) {
				a.mon(a.innerHd, "click", this.onHdClick, this);
				a.innerHd.setStyle("cursor", "pointer");
				a.mon(a.store, "datachanged", this.updateSortState, this);
				this.updateSortState.defer(10, this, [a.store])
			},
			updateSortState : function (c) {
				var g = c.getSortState();
				if (!g) {
					return
				}
				this.sortState = g;
				var e = this.view.columns,
				h = -1;
				for (var d = 0, a = e.length; d < a; d++) {
					if (e[d].dataIndex == g.field) {
						h = d;
						break
					}
				}
				if (h != -1) {
					var b = g.direction;
					this.updateSortIcon(h, b)
				}
			},
			updateSortIcon : function (b, a) {
				var d = this.sortClasses;
				var c = this.view.innerHd.select("em").removeClass(d);
				c.item(b).addClass(d[a == "DESC" ? 1 : 0])
			},
			onHdClick : function (c) {
				var b = c.getTarget("em", 3);
				if (b && !this.view.disableHeaders) {
					var a = this.view.findHeaderIndex(b);
					this.view.store.sort(this.view.columns[a].dataIndex)
				}
			}
		});
Ext.ListView.Sorter = Ext.list.Sorter;
Ext.TabPanel = Ext.extend(Ext.Panel, {
			deferredRender : true,
			tabWidth : 120,
			minTabWidth : 30,
			resizeTabs : false,
			enableTabScroll : false,
			scrollIncrement : 0,
			scrollRepeatInterval : 400,
			scrollDuration : 0.35,
			animScroll : true,
			tabPosition : "top",
			baseCls : "x-tab-panel",
			autoTabs : false,
			autoTabSelector : "div.x-tab",
			activeTab : undefined,
			tabMargin : 2,
			plain : false,
			wheelIncrement : 20,
			idDelimiter : "__",
			itemCls : "x-tab-item",
			elements : "body",
			headerAsText : false,
			frame : false,
			hideBorders : true,
			initComponent : function () {
				this.frame = false;
				Ext.TabPanel.superclass.initComponent.call(this);
				this.addEvents("beforetabchange", "tabchange", "contextmenu");
				this.setLayout(new Ext.layout.CardLayout(Ext.apply({
								layoutOnCardChange : this.layoutOnTabChange,
								deferredRender : this.deferredRender
							}, this.layoutConfig)));
				if (this.tabPosition == "top") {
					this.elements += ",header";
					this.stripTarget = "header"
				} else {
					this.elements += ",footer";
					this.stripTarget = "footer"
				}
				if (!this.stack) {
					this.stack = Ext.TabPanel.AccessStack()
				}
				this.initItems()
			},
			onRender : function (c, a) {
				Ext.TabPanel.superclass.onRender.call(this, c, a);
				if (this.plain) {
					var g = this.tabPosition == "top" ? "header" : "footer";
					this[g].addClass("x-tab-panel-" + g + "-plain")
				}
				var b = this[this.stripTarget];
				this.stripWrap = b.createChild({
							cls : "x-tab-strip-wrap",
							cn : {
								tag : "ul",
								cls : "x-tab-strip x-tab-strip-" + this.tabPosition
							}
						});
				var e = (this.tabPosition == "bottom" ? this.stripWrap : null);
				b.createChild({
						cls : "x-tab-strip-spacer"
					}, e);
				this.strip = new Ext.Element(this.stripWrap.dom.firstChild);
				this.edge = this.strip.createChild({
							tag : "li",
							cls : "x-tab-edge",
							cn : [{
									tag : "span",
									cls : "x-tab-strip-text",
									cn : "&#160;"
								}
							]
						});
				this.strip.createChild({
						cls : "x-clear"
					});
				this.body.addClass("x-tab-panel-body-" + this.tabPosition);
				if (!this.itemTpl) {
					var d = new Ext.Template('<li class="{cls}" id="{id}"><a class="x-tab-strip-close"></a>', '<a class="x-tab-right" href="#"><em class="x-tab-left">', '<span class="x-tab-strip-inner"><span class="x-tab-strip-text {iconCls}">{text}</span></span>', "</em></a></li>");
					d.disableFormats = true;
					d.compile();
					Ext.TabPanel.prototype.itemTpl = d
				}
				this.items.each(this.initTab, this)
			},
			afterRender : function () {
				Ext.TabPanel.superclass.afterRender.call(this);
				if (this.autoTabs) {
					this.readTabs(false)
				}
				if (this.activeTab !== undefined) {
					var a = Ext.isObject(this.activeTab) ? this.activeTab : this.items.get(this.activeTab);
					delete this.activeTab;
					this.setActiveTab(a)
				}
			},
			initEvents : function () {
				Ext.TabPanel.superclass.initEvents.call(this);
				this.mon(this.strip, {
						scope : this,
						mousedown : this.onStripMouseDown,
						contextmenu : this.onStripContextMenu
					});
				if (this.enableTabScroll) {
					this.mon(this.strip, "mousewheel", this.onWheel, this)
				}
			},
			findTargets : function (c) {
				var b = null,
				a = c.getTarget("li:not(.x-tab-edge)", this.strip);
				if (a) {
					b = this.getComponent(a.id.split(this.idDelimiter)[1]);
					if (b.disabled) {
						return {
							close : null,
							item : null,
							el : null
						}
					}
				}
				return {
					close : c.getTarget(".x-tab-strip-close", this.strip),
					item : b,
					el : a
				}
			},
			onStripMouseDown : function (b) {
				if (b.button !== 0) {
					return
				}
				b.preventDefault();
				var a = this.findTargets(b);
				if (a.close) {
					if (a.item.fireEvent("beforeclose", a.item) !== false) {
						a.item.fireEvent("close", a.item);
						this.remove(a.item)
					}
					return
				}
				if (a.item && a.item != this.activeTab) {
					this.setActiveTab(a.item)
				}
			},
			onStripContextMenu : function (b) {
				b.preventDefault();
				var a = this.findTargets(b);
				if (a.item) {
					this.fireEvent("contextmenu", this, a.item, b)
				}
			},
			readTabs : function (d) {
				if (d === true) {
					this.items.each(function (h) {
							this.remove(h)
						}, this)
				}
				var c = this.el.query(this.autoTabSelector);
				for (var b = 0, a = c.length; b < a; b++) {
					var e = c[b],
					g = e.getAttribute("title");
					e.removeAttribute("title");
					this.add({
							title : g,
							contentEl : e
						})
				}
			},
			initTab : function (d, b) {
				var e = this.strip.dom.childNodes[b],
				g = this.getTemplateArgs(d),
				c = e ? this.itemTpl.insertBefore(e, g) : this.itemTpl.append(this.strip, g),
				a = "x-tab-strip-over",
				h = Ext.get(c);
				h.hover(function () {
						if (!d.disabled) {
							h.addClass(a)
						}
					}, function () {
						h.removeClass(a)
					});
				if (d.tabTip) {
					h.child("span.x-tab-strip-text", true).qtip = d.tabTip
				}
				d.tabEl = c;
				h.select("a").on("click", function (i) {
						if (!i.getPageX()) {
							this.onStripMouseDown(i)
						}
					}, this, {
						preventDefault : true
					});
				d.on({
						scope : this,
						disable : this.onItemDisabled,
						enable : this.onItemEnabled,
						titlechange : this.onItemTitleChanged,
						iconchange : this.onItemIconChanged,
						beforeshow : this.onBeforeShowItem
					})
			},
			getTemplateArgs : function (b) {
				var a = b.closable ? "x-tab-strip-closable" : "";
				if (b.disabled) {
					a += " x-item-disabled"
				}
				if (b.iconCls) {
					a += " x-tab-with-icon"
				}
				if (b.tabCls) {
					a += " " + b.tabCls
				}
				return {
					id : this.id + this.idDelimiter + b.getItemId(),
					text : b.title,
					cls : a,
					iconCls : b.iconCls || ""
				}
			},
			onAdd : function (b) {
				Ext.TabPanel.superclass.onAdd.call(this, b);
				if (this.rendered) {
					var a = this.items;
					this.initTab(b, a.indexOf(b));
					this.delegateUpdates()
				}
			},
			onBeforeAdd : function (b) {
				var a = b.events ? (this.items.containsKey(b.getItemId()) ? b : null) : this.items.get(b);
				if (a) {
					this.setActiveTab(b);
					return false
				}
				Ext.TabPanel.superclass.onBeforeAdd.apply(this, arguments);
				var c = b.elements;
				b.elements = c ? c.replace(",header", "") : c;
				b.border = (b.border === true)
			},
			onRemove : function (d) {
				var b = Ext.get(d.tabEl);
				if (b) {
					b.select("a").removeAllListeners();
					Ext.destroy(b)
				}
				Ext.TabPanel.superclass.onRemove.call(this, d);
				this.stack.remove(d);
				delete d.tabEl;
				d.un("disable", this.onItemDisabled, this);
				d.un("enable", this.onItemEnabled, this);
				d.un("titlechange", this.onItemTitleChanged, this);
				d.un("iconchange", this.onItemIconChanged, this);
				d.un("beforeshow", this.onBeforeShowItem, this);
				if (d == this.activeTab) {
					var a = this.stack.next();
					if (a) {
						this.setActiveTab(a)
					} else {
						if (this.items.getCount() > 0) {
							this.setActiveTab(0)
						} else {
							this.setActiveTab(null)
						}
					}
				}
				if (!this.destroying) {
					this.delegateUpdates()
				}
			},
			onBeforeShowItem : function (a) {
				if (a != this.activeTab) {
					this.setActiveTab(a);
					return false
				}
			},
			onItemDisabled : function (b) {
				var a = this.getTabEl(b);
				if (a) {
					Ext.fly(a).addClass("x-item-disabled")
				}
				this.stack.remove(b)
			},
			onItemEnabled : function (b) {
				var a = this.getTabEl(b);
				if (a) {
					Ext.fly(a).removeClass("x-item-disabled")
				}
			},
			onItemTitleChanged : function (b) {
				var a = this.getTabEl(b);
				if (a) {
					Ext.fly(a).child("span.x-tab-strip-text", true).innerHTML = b.title
				}
			},
			onItemIconChanged : function (d, a, c) {
				var b = this.getTabEl(d);
				if (b) {
					b = Ext.get(b);
					b.child("span.x-tab-strip-text").replaceClass(c, a);
					b[Ext.isEmpty(a) ? "removeClass" : "addClass"]("x-tab-with-icon")
				}
			},
			getTabEl : function (a) {
				var b = this.getComponent(a);
				return b ? b.tabEl : null
			},
			onResize : function () {
				Ext.TabPanel.superclass.onResize.apply(this, arguments);
				this.delegateUpdates()
			},
			beginUpdate : function () {
				this.suspendUpdates = true
			},
			endUpdate : function () {
				this.suspendUpdates = false;
				this.delegateUpdates()
			},
			hideTabStripItem : function (b) {
				b = this.getComponent(b);
				var a = this.getTabEl(b);
				if (a) {
					a.style.display = "none";
					this.delegateUpdates()
				}
				this.stack.remove(b)
			},
			unhideTabStripItem : function (b) {
				b = this.getComponent(b);
				var a = this.getTabEl(b);
				if (a) {
					a.style.display = "";
					this.delegateUpdates()
				}
			},
			delegateUpdates : function () {
				var a = this.rendered;
				if (this.suspendUpdates) {
					return
				}
				if (this.resizeTabs && a) {
					this.autoSizeTabs()
				}
				if (this.enableTabScroll && a) {
					this.autoScrollTabs()
				}
			},
			autoSizeTabs : function () {
				var h = this.items.length,
				b = this.tabPosition != "bottom" ? "header" : "footer",
				c = this[b].dom.offsetWidth,
				a = this[b].dom.clientWidth;
				if (!this.resizeTabs || h < 1 || !a) {
					return
				}
				var k = Math.max(Math.min(Math.floor((a - 4) / h) - this.tabMargin, this.tabWidth), this.minTabWidth);
				this.lastTabWidth = k;
				var m = this.strip.query("li:not(.x-tab-edge)");
				for (var e = 0, j = m.length; e < j; e++) {
					var l = m[e],
					n = Ext.fly(l).child(".x-tab-strip-inner", true),
					g = l.offsetWidth,
					d = n.offsetWidth;
					n.style.width = (k - (g - d)) + "px"
				}
			},
			adjustBodyWidth : function (a) {
				if (this.header) {
					this.header.setWidth(a)
				}
				if (this.footer) {
					this.footer.setWidth(a)
				}
				return a
			},
			setActiveTab : function (c) {
				c = this.getComponent(c);
				if (this.fireEvent("beforetabchange", this, c, this.activeTab) === false) {
					return
				}
				if (!this.rendered) {
					this.activeTab = c;
					return
				}
				if (this.activeTab != c) {
					if (this.activeTab) {
						var a = this.getTabEl(this.activeTab);
						if (a) {
							Ext.fly(a).removeClass("x-tab-strip-active")
						}
					}
					this.activeTab = c;
					if (c) {
						var b = this.getTabEl(c);
						Ext.fly(b).addClass("x-tab-strip-active");
						this.stack.add(c);
						this.layout.setActiveItem(c);
						this.delegateUpdates();
						if (this.scrolling) {
							this.scrollToTab(c, this.animScroll)
						}
					}
					this.fireEvent("tabchange", this, c)
				}
			},
			getActiveTab : function () {
				return this.activeTab || null
			},
			getItem : function (a) {
				return this.getComponent(a)
			},
			autoScrollTabs : function () {
				this.pos = this.tabPosition == "bottom" ? this.footer : this.header;
				var h = this.items.length,
				d = this.pos.dom.offsetWidth,
				c = this.pos.dom.clientWidth,
				g = this.stripWrap,
				e = g.dom,
				b = e.offsetWidth,
				i = this.getScrollPos(),
				a = this.edge.getOffsetsTo(this.stripWrap)[0] + i;
				if (!this.enableTabScroll || b < 20) {
					return
				}
				if (h == 0 || a <= c) {
					e.scrollLeft = 0;
					g.setWidth(c);
					if (this.scrolling) {
						this.scrolling = false;
						this.pos.removeClass("x-tab-scrolling");
						this.scrollLeft.hide();
						this.scrollRight.hide();
						if (Ext.isAir || Ext.isWebKit) {
							e.style.marginLeft = "";
							e.style.marginRight = ""
						}
					}
				} else {
					if (!this.scrolling) {
						this.pos.addClass("x-tab-scrolling");
						if (Ext.isAir || Ext.isWebKit) {
							e.style.marginLeft = "18px";
							e.style.marginRight = "18px"
						}
					}
					c -= g.getMargins("lr");
					g.setWidth(c > 20 ? c : 20);
					if (!this.scrolling) {
						if (!this.scrollLeft) {
							this.createScrollers()
						} else {
							this.scrollLeft.show();
							this.scrollRight.show()
						}
					}
					this.scrolling = true;
					if (i > (a - c)) {
						e.scrollLeft = a - c
					} else {
						this.scrollToTab(this.activeTab, false)
					}
					this.updateScrollButtons()
				}
			},
			createScrollers : function () {
				this.pos.addClass("x-tab-scrolling-" + this.tabPosition);
				var c = this.stripWrap.dom.offsetHeight;
				var a = this.pos.insertFirst({
							cls : "x-tab-scroller-left"
						});
				a.setHeight(c);
				a.addClassOnOver("x-tab-scroller-left-over");
				this.leftRepeater = new Ext.util.ClickRepeater(a, {
							interval : this.scrollRepeatInterval,
							handler : this.onScrollLeft,
							scope : this
						});
				this.scrollLeft = a;
				var b = this.pos.insertFirst({
							cls : "x-tab-scroller-right"
						});
				b.setHeight(c);
				b.addClassOnOver("x-tab-scroller-right-over");
				this.rightRepeater = new Ext.util.ClickRepeater(b, {
							interval : this.scrollRepeatInterval,
							handler : this.onScrollRight,
							scope : this
						});
				this.scrollRight = b
			},
			getScrollWidth : function () {
				return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos()
			},
			getScrollPos : function () {
				return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0
			},
			getScrollArea : function () {
				return parseInt(this.stripWrap.dom.clientWidth, 10) || 0
			},
			getScrollAnim : function () {
				return {
					duration : this.scrollDuration,
					callback : this.updateScrollButtons,
					scope : this
				}
			},
			getScrollIncrement : function () {
				return this.scrollIncrement || (this.resizeTabs ? this.lastTabWidth + 2 : 100)
			},
			scrollToTab : function (e, a) {
				if (!e) {
					return
				}
				var c = this.getTabEl(e),
				h = this.getScrollPos(),
				d = this.getScrollArea(),
				g = Ext.fly(c).getOffsetsTo(this.stripWrap)[0] + h,
				b = g + c.offsetWidth;
				if (g < h) {
					this.scrollTo(g, a)
				} else {
					if (b > (h + d)) {
						this.scrollTo(b - d, a)
					}
				}
			},
			scrollTo : function (b, a) {
				this.stripWrap.scrollTo("left", b, a ? this.getScrollAnim() : false);
				if (!a) {
					this.updateScrollButtons()
				}
			},
			onWheel : function (g) {
				var h = g.getWheelDelta() * this.wheelIncrement * -1;
				g.stopEvent();
				var i = this.getScrollPos(),
				c = i + h,
				a = this.getScrollWidth() - this.getScrollArea();
				var b = Math.max(0, Math.min(a, c));
				if (b != i) {
					this.scrollTo(b, false)
				}
			},
			onScrollRight : function () {
				var a = this.getScrollWidth() - this.getScrollArea(),
				c = this.getScrollPos(),
				b = Math.min(a, c + this.getScrollIncrement());
				if (b != c) {
					this.scrollTo(b, this.animScroll)
				}
			},
			onScrollLeft : function () {
				var b = this.getScrollPos(),
				a = Math.max(0, b - this.getScrollIncrement());
				if (a != b) {
					this.scrollTo(a, this.animScroll)
				}
			},
			updateScrollButtons : function () {
				var a = this.getScrollPos();
				this.scrollLeft[a === 0 ? "addClass" : "removeClass"]("x-tab-scroller-left-disabled");
				this.scrollRight[a >= (this.getScrollWidth() - this.getScrollArea()) ? "addClass" : "removeClass"]("x-tab-scroller-right-disabled")
			},
			beforeDestroy : function () {
				Ext.destroy(this.leftRepeater, this.rightRepeater);
				this.deleteMembers("strip", "edge", "scrollLeft", "scrollRight", "stripWrap");
				this.activeTab = null;
				Ext.TabPanel.superclass.beforeDestroy.apply(this)
			}
		});
Ext.reg("tabpanel", Ext.TabPanel);
Ext.TabPanel.prototype.activate = Ext.TabPanel.prototype.setActiveTab;
Ext.TabPanel.AccessStack = function () {
	var a = [];
	return {
		add : function (b) {
			a.push(b);
			if (a.length > 10) {
				a.shift()
			}
		},
		remove : function (e) {
			var d = [];
			for (var c = 0, b = a.length; c < b; c++) {
				if (a[c] != e) {
					d.push(a[c])
				}
			}
			a = d
		},
		next : function () {
			return a.pop()
		}
	}
};
Ext.Button = Ext.extend(Ext.BoxComponent, {
			hidden : false,
			disabled : false,
			pressed : false,
			enableToggle : false,
			menuAlign : "tl-bl?",
			type : "button",
			menuClassTarget : "tr:nth(2)",
			clickEvent : "click",
			handleMouseEvents : true,
			tooltipType : "qtip",
			buttonSelector : "button:first-child",
			scale : "small",
			iconAlign : "left",
			arrowAlign : "right",
			initComponent : function () {
				if (this.menu) {
					if (Ext.isArray(this.menu)) {
						this.menu = {
							items : this.menu
						}
					}
					if (Ext.isObject(this.menu)) {
						this.menu.ownerCt = this
					}
					this.menu = Ext.menu.MenuMgr.get(this.menu);
					this.menu.ownerCt = undefined
				}
				Ext.Button.superclass.initComponent.call(this);
				this.addEvents("click", "toggle", "mouseover", "mouseout", "menushow", "menuhide", "menutriggerover", "menutriggerout");
				if (Ext.isString(this.toggleGroup)) {
					this.enableToggle = true
				}
			},
			getTemplateArgs : function () {
				return [this.type, "x-btn-" + this.scale + " x-btn-icon-" + this.scale + "-" + this.iconAlign, this.getMenuClass(), this.cls, this.id]
			},
			setButtonClass : function () {
				if (this.useSetClass) {
					if (!Ext.isEmpty(this.oldCls)) {
						this.el.removeClass([this.oldCls, "x-btn-pressed"])
					}
					this.oldCls = (this.iconCls || this.icon) ? (this.text ? "x-btn-text-icon" : "x-btn-icon") : "x-btn-noicon";
					this.el.addClass([this.oldCls, this.pressed ? "x-btn-pressed" : null])
				}
			},
			getMenuClass : function () {
				return this.menu ? (this.arrowAlign != "bottom" ? "x-btn-arrow" : "x-btn-arrow-bottom") : ""
			},
			onRender : function (c, a) {
				if (!this.template) {
					if (!Ext.Button.buttonTemplate) {
						Ext.Button.buttonTemplate = new Ext.Template('<table id="{4}" cellspacing="0" class="x-btn {3}"><tbody class="{1}">', '<tr><td class="x-btn-tl"><i>&#160;</i></td><td class="x-btn-tc"></td><td class="x-btn-tr"><i>&#160;</i></td></tr>', '<tr><td class="x-btn-ml"><i>&#160;</i></td><td class="x-btn-mc"><em class="{2}" unselectable="on"><button type="{0}"></button></em></td><td class="x-btn-mr"><i>&#160;</i></td></tr>', '<tr><td class="x-btn-bl"><i>&#160;</i></td><td class="x-btn-bc"></td><td class="x-btn-br"><i>&#160;</i></td></tr>', "</tbody></table>");
						Ext.Button.buttonTemplate.compile()
					}
					this.template = Ext.Button.buttonTemplate
				}
				var b,
				d = this.getTemplateArgs();
				if (a) {
					b = this.template.insertBefore(a, d, true)
				} else {
					b = this.template.append(c, d, true)
				}
				this.btnEl = b.child(this.buttonSelector);
				this.mon(this.btnEl, {
						scope : this,
						focus : this.onFocus,
						blur : this.onBlur
					});
				this.initButtonEl(b, this.btnEl);
				Ext.ButtonToggleMgr.register(this)
			},
			initButtonEl : function (b, c) {
				this.el = b;
				this.setIcon(this.icon);
				this.setText(this.text);
				this.setIconClass(this.iconCls);
				if (Ext.isDefined(this.tabIndex)) {
					c.dom.tabIndex = this.tabIndex
				}
				if (this.tooltip) {
					this.setTooltip(this.tooltip, true)
				}
				if (this.handleMouseEvents) {
					this.mon(b, {
							scope : this,
							mouseover : this.onMouseOver,
							mousedown : this.onMouseDown
						})
				}
				if (this.menu) {
					this.mon(this.menu, {
							scope : this,
							show : this.onMenuShow,
							hide : this.onMenuHide
						})
				}
				if (this.repeat) {
					var a = new Ext.util.ClickRepeater(b, Ext.isObject(this.repeat) ? this.repeat : {});
					this.mon(a, "click", this.onRepeatClick, this)
				} else {
					this.mon(b, this.clickEvent, this.onClick, this)
				}
			},
			afterRender : function () {
				Ext.Button.superclass.afterRender.call(this);
				this.useSetClass = true;
				this.setButtonClass();
				this.doc = Ext.getDoc();
				this.doAutoWidth()
			},
			setIconClass : function (a) {
				this.iconCls = a;
				if (this.el) {
					this.btnEl.dom.className = "";
					this.btnEl.addClass(["x-btn-text", a || ""]);
					this.setButtonClass()
				}
				return this
			},
			setTooltip : function (b, a) {
				if (this.rendered) {
					if (!a) {
						this.clearTip()
					}
					if (Ext.isObject(b)) {
						Ext.QuickTips.register(Ext.apply({
									target : this.btnEl.id
								}, b));
						this.tooltip = b
					} else {
						this.btnEl.dom[this.tooltipType] = b
					}
				} else {
					this.tooltip = b
				}
				return this
			},
			clearTip : function () {
				if (Ext.isObject(this.tooltip)) {
					Ext.QuickTips.unregister(this.btnEl)
				}
			},
			beforeDestroy : function () {
				if (this.rendered) {
					this.clearTip()
				}
				if (this.menu && this.destroyMenu !== false) {
					Ext.destroy(this.btnEl, this.menu)
				}
				Ext.destroy(this.repeater)
			},
			onDestroy : function () {
				if (this.rendered) {
					this.doc.un("mouseover", this.monitorMouseOver, this);
					this.doc.un("mouseup", this.onMouseUp, this);
					delete this.doc;
					delete this.btnEl;
					Ext.ButtonToggleMgr.unregister(this)
				}
				Ext.Button.superclass.onDestroy.call(this)
			},
			doAutoWidth : function () {
				if (this.autoWidth !== false && this.el && this.text && this.width === undefined) {
					this.el.setWidth("auto");
					if (Ext.isIE7 && Ext.isStrict) {
						var a = this.btnEl;
						if (a && a.getWidth() > 20) {
							a.clip();
							a.setWidth(Ext.util.TextMetrics.measure(a, this.text).width + a.getFrameWidth("lr"))
						}
					}
					if (this.minWidth) {
						if (this.el.getWidth() < this.minWidth) {
							this.el.setWidth(this.minWidth)
						}
					}
				}
			},
			setHandler : function (b, a) {
				this.handler = b;
				this.scope = a;
				return this
			},
			setText : function (a) {
				this.text = a;
				if (this.el) {
					this.btnEl.update(a || "&#160;");
					this.setButtonClass()
				}
				this.doAutoWidth();
				return this
			},
			setIcon : function (a) {
				this.icon = a;
				if (this.el) {
					this.btnEl.setStyle("background-image", a ? "url(" + a + ")" : "");
					this.setButtonClass()
				}
				return this
			},
			getText : function () {
				return this.text
			},
			toggle : function (b, a) {
				b = b === undefined ? !this.pressed : !!b;
				if (b != this.pressed) {
					if (this.rendered) {
						this.el[b ? "addClass" : "removeClass"]("x-btn-pressed")
					}
					this.pressed = b;
					if (!a) {
						this.fireEvent("toggle", this, b);
						if (this.toggleHandler) {
							this.toggleHandler.call(this.scope || this, this, b)
						}
					}
				}
				return this
			},
			onDisable : function () {
				this.onDisableChange(true)
			},
			onEnable : function () {
				this.onDisableChange(false)
			},
			onDisableChange : function (a) {
				if (this.el) {
					if (!Ext.isIE6 || !this.text) {
						this.el[a ? "addClass" : "removeClass"](this.disabledClass)
					}
					this.el.dom.disabled = a
				}
				this.disabled = a
			},
			showMenu : function () {
				if (this.rendered && this.menu) {
					if (this.tooltip) {
						Ext.QuickTips.getQuickTip().cancelShow(this.btnEl)
					}
					if (this.menu.isVisible()) {
						this.menu.hide()
					}
					this.menu.ownerCt = this;
					this.menu.show(this.el, this.menuAlign)
				}
				return this
			},
			hideMenu : function () {
				if (this.hasVisibleMenu()) {
					this.menu.hide()
				}
				return this
			},
			hasVisibleMenu : function () {
				return this.menu && this.menu.ownerCt == this && this.menu.isVisible()
			},
			onRepeatClick : function (a, b) {
				this.onClick(b)
			},
			onClick : function (a) {
				if (a) {
					a.preventDefault()
				}
				if (a.button !== 0) {
					return
				}
				if (!this.disabled) {
					this.doToggle();
					if (this.menu && !this.hasVisibleMenu() && !this.ignoreNextClick) {
						this.showMenu()
					}
					this.fireEvent("click", this, a);
					if (this.handler) {
						this.handler.call(this.scope || this, this, a)
					}
				}
			},
			doToggle : function () {
				if (this.enableToggle && (this.allowDepress !== false || !this.pressed)) {
					this.toggle()
				}
			},
			isMenuTriggerOver : function (b, a) {
				return this.menu && !a
			},
			isMenuTriggerOut : function (b, a) {
				return this.menu && !a
			},
			onMouseOver : function (b) {
				if (!this.disabled) {
					var a = b.within(this.el, true);
					if (!a) {
						this.el.addClass("x-btn-over");
						if (!this.monitoringMouseOver) {
							this.doc.on("mouseover", this.monitorMouseOver, this);
							this.monitoringMouseOver = true
						}
						this.fireEvent("mouseover", this, b)
					}
					if (this.isMenuTriggerOver(b, a)) {
						this.fireEvent("menutriggerover", this, this.menu, b)
					}
				}
			},
			monitorMouseOver : function (a) {
				if (a.target != this.el.dom && !a.within(this.el)) {
					if (this.monitoringMouseOver) {
						this.doc.un("mouseover", this.monitorMouseOver, this);
						this.monitoringMouseOver = false
					}
					this.onMouseOut(a)
				}
			},
			onMouseOut : function (b) {
				var a = b.within(this.el) && b.target != this.el.dom;
				this.el.removeClass("x-btn-over");
				this.fireEvent("mouseout", this, b);
				if (this.isMenuTriggerOut(b, a)) {
					this.fireEvent("menutriggerout", this, this.menu, b)
				}
			},
			focus : function () {
				this.btnEl.focus()
			},
			blur : function () {
				this.btnEl.blur()
			},
			onFocus : function (a) {
				if (!this.disabled) {
					this.el.addClass("x-btn-focus")
				}
			},
			onBlur : function (a) {
				this.el.removeClass("x-btn-focus")
			},
			getClickEl : function (b, a) {
				return this.el
			},
			onMouseDown : function (a) {
				if (!this.disabled && a.button === 0) {
					this.getClickEl(a).addClass("x-btn-click");
					this.doc.on("mouseup", this.onMouseUp, this)
				}
			},
			onMouseUp : function (a) {
				if (a.button === 0) {
					this.getClickEl(a, true).removeClass("x-btn-click");
					this.doc.un("mouseup", this.onMouseUp, this)
				}
			},
			onMenuShow : function (a) {
				if (this.menu.ownerCt == this) {
					this.menu.ownerCt = this;
					this.ignoreNextClick = 0;
					this.el.addClass("x-btn-menu-active");
					this.fireEvent("menushow", this, this.menu)
				}
			},
			onMenuHide : function (a) {
				if (this.menu.ownerCt == this) {
					this.el.removeClass("x-btn-menu-active");
					this.ignoreNextClick = this.restoreClick.defer(250, this);
					this.fireEvent("menuhide", this, this.menu);
					delete this.menu.ownerCt
				}
			},
			restoreClick : function () {
				this.ignoreNextClick = 0
			}
		});
Ext.reg("button", Ext.Button);
Ext.ButtonToggleMgr = function () {
	var a = {};
	function b(e, j) {
		if (j) {
			var h = a[e.toggleGroup];
			for (var d = 0, c = h.length; d < c; d++) {
				if (h[d] != e) {
					h[d].toggle(false)
				}
			}
		}
	}
	return {
		register : function (c) {
			if (!c.toggleGroup) {
				return
			}
			var d = a[c.toggleGroup];
			if (!d) {
				d = a[c.toggleGroup] = []
			}
			d.push(c);
			c.on("toggle", b)
		},
		unregister : function (c) {
			if (!c.toggleGroup) {
				return
			}
			var d = a[c.toggleGroup];
			if (d) {
				d.remove(c);
				c.un("toggle", b)
			}
		},
		getPressed : function (h) {
			var e = a[h];
			if (e) {
				for (var d = 0, c = e.length; d < c; d++) {
					if (e[d].pressed === true) {
						return e[d]
					}
				}
			}
			return null
		}
	}
}
();
Ext.SplitButton = Ext.extend(Ext.Button, {
			arrowSelector : "em",
			split : true,
			initComponent : function () {
				Ext.SplitButton.superclass.initComponent.call(this);
				this.addEvents("arrowclick")
			},
			onRender : function () {
				Ext.SplitButton.superclass.onRender.apply(this, arguments);
				if (this.arrowTooltip) {
					this.el.child(this.arrowSelector).dom[this.tooltipType] = this.arrowTooltip
				}
			},
			setArrowHandler : function (b, a) {
				this.arrowHandler = b;
				this.scope = a
			},
			getMenuClass : function () {
				return "x-btn-split" + (this.arrowAlign == "bottom" ? "-bottom" : "")
			},
			isClickOnArrow : function (c) {
				if (this.arrowAlign != "bottom") {
					var b = this.el.child("em.x-btn-split");
					var a = b.getRegion().right - b.getPadding("r");
					return c.getPageX() > a
				} else {
					return c.getPageY() > this.btnEl.getRegion().bottom
				}
			},
			onClick : function (b, a) {
				b.preventDefault();
				if (!this.disabled) {
					if (this.isClickOnArrow(b)) {
						if (this.menu && !this.menu.isVisible() && !this.ignoreNextClick) {
							this.showMenu()
						}
						this.fireEvent("arrowclick", this, b);
						if (this.arrowHandler) {
							this.arrowHandler.call(this.scope || this, this, b)
						}
					} else {
						this.doToggle();
						this.fireEvent("click", this, b);
						if (this.handler) {
							this.handler.call(this.scope || this, this, b)
						}
					}
				}
			},
			isMenuTriggerOver : function (a) {
				return this.menu && a.target.tagName == this.arrowSelector
			},
			isMenuTriggerOut : function (b, a) {
				return this.menu && b.target.tagName != this.arrowSelector
			}
		});
Ext.reg("splitbutton", Ext.SplitButton);
Ext.CycleButton = Ext.extend(Ext.SplitButton, {
			getItemText : function (a) {
				if (a && this.showText === true) {
					var b = "";
					if (this.prependText) {
						b += this.prependText
					}
					b += a.text;
					return b
				}
				return undefined
			},
			setActiveItem : function (c, a) {
				if (!Ext.isObject(c)) {
					c = this.menu.getComponent(c)
				}
				if (c) {
					if (!this.rendered) {
						this.text = this.getItemText(c);
						this.iconCls = c.iconCls
					} else {
						var b = this.getItemText(c);
						if (b) {
							this.setText(b)
						}
						this.setIconClass(c.iconCls)
					}
					this.activeItem = c;
					if (!c.checked) {
						c.setChecked(true, a)
					}
					if (this.forceIcon) {
						this.setIconClass(this.forceIcon)
					}
					if (!a) {
						this.fireEvent("change", this, c)
					}
				}
			},
			getActiveItem : function () {
				return this.activeItem
			},
			initComponent : function () {
				this.addEvents("change");
				if (this.changeHandler) {
					this.on("change", this.changeHandler, this.scope || this);
					delete this.changeHandler
				}
				this.itemCount = this.items.length;
				this.menu = {
					cls : "x-cycle-menu",
					items : []
				};
				var a = 0;
				Ext.each(this.items, function (c, b) {
						Ext.apply(c, {
								group : c.group || this.id,
								itemIndex : b,
								checkHandler : this.checkHandler,
								scope : this,
								checked : c.checked || false
							});
						this.menu.items.push(c);
						if (c.checked) {
							a = b
						}
					}, this);
				Ext.CycleButton.superclass.initComponent.call(this);
				this.on("click", this.toggleSelected, this);
				this.setActiveItem(a, true)
			},
			checkHandler : function (a, b) {
				if (b) {
					this.setActiveItem(a)
				}
			},
			toggleSelected : function () {
				var a = this.menu;
				a.render();
				if (!a.hasLayout) {
					a.doLayout()
				}
				var d,
				b;
				for (var c = 1; c < this.itemCount; c++) {
					d = (this.activeItem.itemIndex + c) % this.itemCount;
					b = a.items.itemAt(d);
					if (!b.disabled) {
						b.setChecked(true);
						break
					}
				}
			}
		});
Ext.reg("cycle", Ext.CycleButton);
Ext.Toolbar = function (a) {
	if (Ext.isArray(a)) {
		a = {
			items : a,
			layout : "toolbar"
		}
	} else {
		a = Ext.apply({
					layout : "toolbar"
				}, a);
		if (a.buttons) {
			a.items = a.buttons
		}
	}
	Ext.Toolbar.superclass.constructor.call(this, a)
};
(function () {
		var a = Ext.Toolbar;
		Ext.extend(a, Ext.Container, {
				defaultType : "button",
				enableOverflow : false,
				trackMenus : true,
				internalDefaults : {
					removeMode : "container",
					hideParent : true
				},
				toolbarCls : "x-toolbar",
				initComponent : function () {
					a.superclass.initComponent.call(this);
					this.addEvents("overflowchange")
				},
				onRender : function (c, b) {
					if (!this.el) {
						if (!this.autoCreate) {
							this.autoCreate = {
								cls : this.toolbarCls + " x-small-editor"
							}
						}
						this.el = c.createChild(Ext.apply({
										id : this.id
									}, this.autoCreate), b);
						Ext.Toolbar.superclass.onRender.apply(this, arguments)
					}
				},
				lookupComponent : function (b) {
					if (Ext.isString(b)) {
						if (b == "-") {
							b = new a.Separator()
						} else {
							if (b == " ") {
								b = new a.Spacer()
							} else {
								if (b == "->") {
									b = new a.Fill()
								} else {
									b = new a.TextItem(b)
								}
							}
						}
						this.applyDefaults(b)
					} else {
						if (b.isFormField || b.render) {
							b = this.createComponent(b)
						} else {
							if (b.tag) {
								b = new a.Item({
											autoEl : b
										})
							} else {
								if (b.tagName) {
									b = new a.Item({
												el : b
											})
								} else {
									if (Ext.isObject(b)) {
										b = b.xtype ? this.createComponent(b) : this.constructButton(b)
									}
								}
							}
						}
					}
					return b
				},
				applyDefaults : function (e) {
					if (!Ext.isString(e)) {
						e = Ext.Toolbar.superclass.applyDefaults.call(this, e);
						var b = this.internalDefaults;
						if (e.events) {
							Ext.applyIf(e.initialConfig, b);
							Ext.apply(e, b)
						} else {
							Ext.applyIf(e, b)
						}
					}
					return e
				},
				addSeparator : function () {
					return this.add(new a.Separator())
				},
				addSpacer : function () {
					return this.add(new a.Spacer())
				},
				addFill : function () {
					this.add(new a.Fill())
				},
				addElement : function (b) {
					return this.addItem(new a.Item({
								el : b
							}))
				},
				addItem : function (b) {
					return this.add.apply(this, arguments)
				},
				addButton : function (c) {
					if (Ext.isArray(c)) {
						var e = [];
						for (var d = 0, b = c.length; d < b; d++) {
							e.push(this.addButton(c[d]))
						}
						return e
					}
					return this.add(this.constructButton(c))
				},
				addText : function (b) {
					return this.addItem(new a.TextItem(b))
				},
				addDom : function (b) {
					return this.add(new a.Item({
								autoEl : b
							}))
				},
				addField : function (b) {
					return this.add(b)
				},
				insertButton : function (c, g) {
					if (Ext.isArray(g)) {
						var e = [];
						for (var d = 0, b = g.length; d < b; d++) {
							e.push(this.insertButton(c + d, g[d]))
						}
						return e
					}
					return Ext.Toolbar.superclass.insert.call(this, c, g)
				},
				trackMenu : function (c, b) {
					if (this.trackMenus && c.menu) {
						var d = b ? "mun" : "mon";
						this[d](c, "menutriggerover", this.onButtonTriggerOver, this);
						this[d](c, "menushow", this.onButtonMenuShow, this);
						this[d](c, "menuhide", this.onButtonMenuHide, this)
					}
				},
				constructButton : function (d) {
					var c = d.events ? d : this.createComponent(d, d.split ? "splitbutton" : this.defaultType);
					return c
				},
				onAdd : function (b) {
					Ext.Toolbar.superclass.onAdd.call(this);
					this.trackMenu(b);
					if (this.disabled) {
						b.disable()
					}
				},
				onRemove : function (b) {
					Ext.Toolbar.superclass.onRemove.call(this);
					if (b == this.activeMenuBtn) {
						delete this.activeMenuBtn
					}
					this.trackMenu(b, true)
				},
				onDisable : function () {
					this.items.each(function (b) {
							if (b.disable) {
								b.disable()
							}
						})
				},
				onEnable : function () {
					this.items.each(function (b) {
							if (b.enable) {
								b.enable()
							}
						})
				},
				onButtonTriggerOver : function (b) {
					if (this.activeMenuBtn && this.activeMenuBtn != b) {
						this.activeMenuBtn.hideMenu();
						b.showMenu();
						this.activeMenuBtn = b
					}
				},
				onButtonMenuShow : function (b) {
					this.activeMenuBtn = b
				},
				onButtonMenuHide : function (b) {
					delete this.activeMenuBtn
				}
			});
		Ext.reg("toolbar", Ext.Toolbar);
		a.Item = Ext.extend(Ext.BoxComponent, {
					hideParent : true,
					enable : Ext.emptyFn,
					disable : Ext.emptyFn,
					focus : Ext.emptyFn
				});
		Ext.reg("tbitem", a.Item);
		a.Separator = Ext.extend(a.Item, {
					onRender : function (c, b) {
						this.el = c.createChild({
									tag : "span",
									cls : "xtb-sep"
								}, b)
					}
				});
		Ext.reg("tbseparator", a.Separator);
		a.Spacer = Ext.extend(a.Item, {
					onRender : function (c, b) {
						this.el = c.createChild({
									tag : "div",
									cls : "xtb-spacer",
									style : this.width ? "width:" + this.width + "px" : ""
								}, b)
					}
				});
		Ext.reg("tbspacer", a.Spacer);
		a.Fill = Ext.extend(a.Item, {
					render : Ext.emptyFn,
					isFill : true
				});
		Ext.reg("tbfill", a.Fill);
		a.TextItem = Ext.extend(a.Item, {
					constructor : function (b) {
						a.TextItem.superclass.constructor.call(this, Ext.isString(b) ? {
								text : b
							}
							 : b)
					},
					onRender : function (c, b) {
						this.autoEl = {
							cls : "xtb-text",
							html : this.text || ""
						};
						a.TextItem.superclass.onRender.call(this, c, b)
					},
					setText : function (b) {
						if (this.rendered) {
							this.el.update(b)
						} else {
							this.text = b
						}
					}
				});
		Ext.reg("tbtext", a.TextItem);
		a.Button = Ext.extend(Ext.Button, {});
		a.SplitButton = Ext.extend(Ext.SplitButton, {});
		Ext.reg("tbbutton", a.Button);
		Ext.reg("tbsplit", a.SplitButton)
	})();
Ext.ButtonGroup = Ext.extend(Ext.Panel, {
			baseCls : "x-btn-group",
			layout : "table",
			defaultType : "button",
			frame : true,
			internalDefaults : {
				removeMode : "container",
				hideParent : true
			},
			initComponent : function () {
				this.layoutConfig = this.layoutConfig || {};
				Ext.applyIf(this.layoutConfig, {
						columns : this.columns
					});
				if (!this.title) {
					this.addClass("x-btn-group-notitle")
				}
				this.on("afterlayout", this.onAfterLayout, this);
				Ext.ButtonGroup.superclass.initComponent.call(this)
			},
			applyDefaults : function (b) {
				b = Ext.ButtonGroup.superclass.applyDefaults.call(this, b);
				var a = this.internalDefaults;
				if (b.events) {
					Ext.applyIf(b.initialConfig, a);
					Ext.apply(b, a)
				} else {
					Ext.applyIf(b, a)
				}
				return b
			},
			onAfterLayout : function () {
				var a = this.body.getFrameWidth("lr") + this.body.dom.firstChild.offsetWidth;
				this.body.setWidth(a);
				this.el.setWidth(a + this.getFrameWidth())
			}
		});
Ext.reg("buttongroup", Ext.ButtonGroup);
(function () {
		var a = Ext.Toolbar;
		Ext.PagingToolbar = Ext.extend(Ext.Toolbar, {
					pageSize : 20,
					displayMsg : "Displaying {0} - {1} of {2}",
					emptyMsg : "No data to display",
					beforePageText : "Page",
					afterPageText : "of {0}",
					firstText : "First Page",
					prevText : "Previous Page",
					nextText : "Next Page",
					lastText : "Last Page",
					refreshText : "Refresh",
					initComponent : function () {
						var c = [this.first = new a.Button({
										tooltip : this.firstText,
										overflowText : this.firstText,
										iconCls : "x-tbar-page-first",
										disabled : true,
										handler : this.moveFirst,
										scope : this
									}), this.prev = new a.Button({
										tooltip : this.prevText,
										overflowText : this.prevText,
										iconCls : "x-tbar-page-prev",
										disabled : true,
										handler : this.movePrevious,
										scope : this
									}), "-", this.beforePageText, this.inputItem = new Ext.form.NumberField({
										cls : "x-tbar-page-number",
										allowDecimals : false,
										allowNegative : false,
										enableKeyEvents : true,
										selectOnFocus : true,
										submitValue : false,
										listeners : {
											scope : this,
											keydown : this.onPagingKeyDown,
											blur : this.onPagingBlur
										}
									}), this.afterTextItem = new a.TextItem({
										text : String.format(this.afterPageText, 1)
									}), "-", this.next = new a.Button({
										tooltip : this.nextText,
										overflowText : this.nextText,
										iconCls : "x-tbar-page-next",
										disabled : true,
										handler : this.moveNext,
										scope : this
									}), this.last = new a.Button({
										tooltip : this.lastText,
										overflowText : this.lastText,
										iconCls : "x-tbar-page-last",
										disabled : true,
										handler : this.moveLast,
										scope : this
									}), "-", this.refresh = new a.Button({
										tooltip : this.refreshText,
										overflowText : this.refreshText,
										iconCls : "x-tbar-loading",
										handler : this.doRefresh,
										scope : this
									})];
						var b = this.items || this.buttons || [];
						if (this.prependButtons) {
							this.items = b.concat(c)
						} else {
							this.items = c.concat(b)
						}
						delete this.buttons;
						if (this.displayInfo) {
							this.items.push("->");
							this.items.push(this.displayItem = new a.TextItem({}))
						}
						Ext.PagingToolbar.superclass.initComponent.call(this);
						this.addEvents("change", "beforechange");
						this.on("afterlayout", this.onFirstLayout, this, {
								single : true
							});
						this.cursor = 0;
						this.bindStore(this.store, true)
					},
					onFirstLayout : function () {
						if (this.dsLoaded) {
							this.onLoad.apply(this, this.dsLoaded)
						}
					},
					updateInfo : function () {
						if (this.displayItem) {
							var b = this.store.getCount();
							var c = b == 0 ? this.emptyMsg : String.format(this.displayMsg, this.cursor + 1, this.cursor + b, this.store.getTotalCount());
							this.displayItem.setText(c)
						}
					},
					onLoad : function (b, e, j) {
						if (!this.rendered) {
							this.dsLoaded = [b, e, j];
							return
						}
						var g = this.getParams();
						this.cursor = (j.params && j.params[g.start]) ? j.params[g.start] : 0;
						var i = this.getPageData(),
						c = i.activePage,
						h = i.pages;
						this.afterTextItem.setText(String.format(this.afterPageText, i.pages));
						this.inputItem.setValue(c);
						this.first.setDisabled(c == 1);
						this.prev.setDisabled(c == 1);
						this.next.setDisabled(c == h);
						this.last.setDisabled(c == h);
						this.refresh.enable();
						this.updateInfo();
						this.fireEvent("change", this, i)
					},
					getPageData : function () {
						var b = this.store.getTotalCount();
						return {
							total : b,
							activePage : Math.ceil((this.cursor + this.pageSize) / this.pageSize),
							pages : b < this.pageSize ? 1 : Math.ceil(b / this.pageSize)
						}
					},
					changePage : function (b) {
						this.doLoad(((b - 1) * this.pageSize).constrain(0, this.store.getTotalCount()))
					},
					onLoadError : function () {
						if (!this.rendered) {
							return
						}
						this.refresh.enable()
					},
					readPage : function (e) {
						var b = this.inputItem.getValue(),
						c;
						if (!b || isNaN(c = parseInt(b, 10))) {
							this.inputItem.setValue(e.activePage);
							return false
						}
						return c
					},
					onPagingFocus : function () {
						this.inputItem.select()
					},
					onPagingBlur : function (b) {
						this.inputItem.setValue(this.getPageData().activePage)
					},
					onPagingKeyDown : function (i, h) {
						var c = h.getKey(),
						j = this.getPageData(),
						g;
						if (c == h.RETURN) {
							h.stopEvent();
							g = this.readPage(j);
							if (g !== false) {
								g = Math.min(Math.max(1, g), j.pages) - 1;
								this.doLoad(g * this.pageSize)
							}
						} else {
							if (c == h.HOME || c == h.END) {
								h.stopEvent();
								g = c == h.HOME ? 1 : j.pages;
								i.setValue(g)
							} else {
								if (c == h.UP || c == h.PAGEUP || c == h.DOWN || c == h.PAGEDOWN) {
									h.stopEvent();
									if ((g = this.readPage(j))) {
										var b = h.shiftKey ? 10 : 1;
										if (c == h.DOWN || c == h.PAGEDOWN) {
											b *= -1
										}
										g += b;
										if (g >= 1 & g <= j.pages) {
											i.setValue(g)
										}
									}
								}
							}
						}
					},
					getParams : function () {
						return this.paramNames || this.store.paramNames
					},
					beforeLoad : function () {
						if (this.rendered && this.refresh) {
							this.refresh.disable()
						}
					},
					doLoad : function (d) {
						var c = {},
						b = this.getParams();
						c[b.start] = d;
						c[b.limit] = this.pageSize;
						if (this.fireEvent("beforechange", this, c) !== false) {
							this.store.load({
									params : c
								})
						}
					},
					moveFirst : function () {
						this.doLoad(0)
					},
					movePrevious : function () {
						this.doLoad(Math.max(0, this.cursor - this.pageSize))
					},
					moveNext : function () {
						this.doLoad(this.cursor + this.pageSize)
					},
					moveLast : function () {
						var c = this.store.getTotalCount(),
						b = c % this.pageSize;
						this.doLoad(b ? (c - b) : c - this.pageSize)
					},
					doRefresh : function () {
						this.doLoad(this.cursor)
					},
					bindStore : function (c, d) {
						var b;
						if (!d && this.store) {
							if (c !== this.store && this.store.autoDestroy) {
								this.store.destroy()
							} else {
								this.store.un("beforeload", this.beforeLoad, this);
								this.store.un("load", this.onLoad, this);
								this.store.un("exception", this.onLoadError, this)
							}
							if (!c) {
								this.store = null
							}
						}
						if (c) {
							c = Ext.StoreMgr.lookup(c);
							c.on({
									scope : this,
									beforeload : this.beforeLoad,
									load : this.onLoad,
									exception : this.onLoadError
								});
							b = true
						}
						this.store = c;
						if (b) {
							this.onLoad(c, null, {})
						}
					},
					unbind : function (b) {
						this.bindStore(null)
					},
					bind : function (b) {
						this.bindStore(b)
					},
					onDestroy : function () {
						this.bindStore(null);
						Ext.PagingToolbar.superclass.onDestroy.call(this)
					}
				})
	})();
Ext.reg("paging", Ext.PagingToolbar);
Ext.History = (function () {
		var e,
		c;
		var k = false;
		var d;
		function g() {
			var l = location.href,
			m = l.indexOf("#"),
			n = m >= 0 ? l.substr(m + 1) : null;
			if (Ext.isGecko) {
				n = decodeURIComponent(n)
			}
			return n
		}
		function a() {
			c.value = d
		}
		function h(l) {
			d = l;
			Ext.History.fireEvent("change", l)
		}
		function i(m) {
			var l = ['<html><body><div id="state">', Ext.util.Format.htmlEncode(m), "</div></body></html>"].join("");
			try {
				var o = e.contentWindow.document;
				o.open();
				o.write(l);
				o.close();
				return true
			} catch (n) {
				return false
			}
		}
		function b() {
			if (!e.contentWindow || !e.contentWindow.document) {
				setTimeout(b, 10);
				return
			}
			var o = e.contentWindow.document;
			var m = o.getElementById("state");
			var l = m ? m.innerText : null;
			var n = g();
			setInterval(function () {
					o = e.contentWindow.document;
					m = o.getElementById("state");
					var q = m ? m.innerText : null;
					var p = g();
					if (q !== l) {
						l = q;
						h(l);
						location.hash = l;
						n = l;
						a()
					} else {
						if (p !== n) {
							n = p;
							i(p)
						}
					}
				}, 50);
			k = true;
			Ext.History.fireEvent("ready", Ext.History)
		}
		function j() {
			d = c.value ? c.value : g();
			if (Ext.isIE) {
				b()
			} else {
				var l = g();
				setInterval(function () {
						var m = g();
						if (m !== l) {
							l = m;
							h(l);
							a()
						}
					}, 50);
				k = true;
				Ext.History.fireEvent("ready", Ext.History)
			}
		}
		return {
			fieldId : "x-history-field",
			iframeId : "x-history-frame",
			events : {},
			init : function (m, l) {
				if (k) {
					Ext.callback(m, l, [this]);
					return
				}
				if (!Ext.isReady) {
					Ext.onReady(function () {
							Ext.History.init(m, l)
						});
					return
				}
				c = Ext.getDom(Ext.History.fieldId);
				if (Ext.isIE) {
					e = Ext.getDom(Ext.History.iframeId)
				}
				this.addEvents("ready", "change");
				if (m) {
					this.on("ready", m, l, {
							single : true
						})
				}
				j()
			},
			add : function (l, m) {
				if (m !== false) {
					if (this.getToken() == l) {
						return true
					}
				}
				if (Ext.isIE) {
					return i(l)
				} else {
					location.hash = l;
					return true
				}
			},
			back : function () {
				history.go(-1)
			},
			forward : function () {
				history.go(1)
			},
			getToken : function () {
				return k ? d : g()
			}
		}
	})();
Ext.apply(Ext.History, new Ext.util.Observable());
Ext.Tip = Ext.extend(Ext.Panel, {
			minWidth : 40,
			maxWidth : 300,
			shadow : "sides",
			defaultAlign : "tl-bl?",
			autoRender : true,
			quickShowInterval : 250,
			frame : true,
			hidden : true,
			baseCls : "x-tip",
			floating : {
				shadow : true,
				shim : true,
				useDisplay : true,
				constrain : false
			},
			autoHeight : true,
			closeAction : "hide",
			initComponent : function () {
				Ext.Tip.superclass.initComponent.call(this);
				if (this.closable && !this.title) {
					this.elements += ",header"
				}
			},
			afterRender : function () {
				Ext.Tip.superclass.afterRender.call(this);
				if (this.closable) {
					this.addTool({
							id : "close",
							handler : this[this.closeAction],
							scope : this
						})
				}
			},
			showAt : function (a) {
				Ext.Tip.superclass.show.call(this);
				if (this.measureWidth !== false && (!this.initialConfig || typeof this.initialConfig.width != "number")) {
					this.doAutoWidth()
				}
				if (this.constrainPosition) {
					a = this.el.adjustForConstraints(a)
				}
				this.setPagePosition(a[0], a[1])
			},
			doAutoWidth : function (a) {
				a = a || 0;
				var b = this.body.getTextWidth();
				if (this.title) {
					b = Math.max(b, this.header.child("span").getTextWidth(this.title))
				}
				b += this.getFrameWidth() + (this.closable ? 20 : 0) + this.body.getPadding("lr") + a;
				this.setWidth(b.constrain(this.minWidth, this.maxWidth));
				if (Ext.isIE7 && !this.repainted) {
					this.el.repaint();
					this.repainted = true
				}
			},
			showBy : function (a, b) {
				if (!this.rendered) {
					this.render(Ext.getBody())
				}
				this.showAt(this.el.getAlignToXY(a, b || this.defaultAlign))
			},
			initDraggable : function () {
				this.dd = new Ext.Tip.DD(this, typeof this.draggable == "boolean" ? null : this.draggable);
				this.header.addClass("x-tip-draggable")
			}
		});
Ext.reg("tip", Ext.Tip);
Ext.Tip.DD = function (b, a) {
	Ext.apply(this, a);
	this.tip = b;
	Ext.Tip.DD.superclass.constructor.call(this, b.el.id, "WindowDD-" + b.id);
	this.setHandleElId(b.header.id);
	this.scroll = false
};
Ext.extend(Ext.Tip.DD, Ext.dd.DD, {
		moveOnly : true,
		scroll : false,
		headerOffsets : [100, 25],
		startDrag : function () {
			this.tip.el.disableShadow()
		},
		endDrag : function (a) {
			this.tip.el.enableShadow(true)
		}
	});
Ext.ToolTip = Ext.extend(Ext.Tip, {
			showDelay : 500,
			hideDelay : 200,
			dismissDelay : 5000,
			trackMouse : false,
			anchorToTarget : true,
			anchorOffset : 0,
			targetCounter : 0,
			constrainPosition : false,
			initComponent : function () {
				Ext.ToolTip.superclass.initComponent.call(this);
				this.lastActive = new Date();
				this.initTarget(this.target);
				this.origAnchor = this.anchor
			},
			onRender : function (b, a) {
				Ext.ToolTip.superclass.onRender.call(this, b, a);
				this.anchorCls = "x-tip-anchor-" + this.getAnchorPosition();
				this.anchorEl = this.el.createChild({
							cls : "x-tip-anchor " + this.anchorCls
						})
			},
			afterRender : function () {
				Ext.ToolTip.superclass.afterRender.call(this);
				this.anchorEl.setStyle("z-index", this.el.getZIndex() + 1).setVisibilityMode(Ext.Element.DISPLAY)
			},
			initTarget : function (c) {
				var a;
				if ((a = Ext.get(c))) {
					if (this.target) {
						var b = Ext.get(this.target);
						this.mun(b, "mouseover", this.onTargetOver, this);
						this.mun(b, "mouseout", this.onTargetOut, this);
						this.mun(b, "mousemove", this.onMouseMove, this)
					}
					this.mon(a, {
							mouseover : this.onTargetOver,
							mouseout : this.onTargetOut,
							mousemove : this.onMouseMove,
							scope : this
						});
					this.target = a
				}
				if (this.anchor) {
					this.anchorTarget = this.target
				}
			},
			onMouseMove : function (b) {
				var a = this.delegate ? b.getTarget(this.delegate) : this.triggerElement = true;
				if (a) {
					this.targetXY = b.getXY();
					if (a === this.triggerElement) {
						if (!this.hidden && this.trackMouse) {
							this.setPagePosition(this.getTargetXY())
						}
					} else {
						this.hide();
						this.lastActive = new Date(0);
						this.onTargetOver(b)
					}
				} else {
					if (!this.closable && this.isVisible()) {
						this.hide()
					}
				}
			},
			getTargetXY : function () {
				if (this.delegate) {
					this.anchorTarget = this.triggerElement
				}
				if (this.anchor) {
					this.targetCounter++;
					var c = this.getOffsets(),
					l = (this.anchorToTarget && !this.trackMouse) ? this.el.getAlignToXY(this.anchorTarget, this.getAnchorAlign()) : this.targetXY,
					a = Ext.lib.Dom.getViewWidth() - 5,
					h = Ext.lib.Dom.getViewHeight() - 5,
					i = document.documentElement,
					e = document.body,
					k = (i.scrollLeft || e.scrollLeft || 0) + 5,
					j = (i.scrollTop || e.scrollTop || 0) + 5,
					b = [l[0] + c[0], l[1] + c[1]],
					g = this.getSize();
					this.anchorEl.removeClass(this.anchorCls);
					if (this.targetCounter < 2) {
						if (b[0] < k) {
							if (this.anchorToTarget) {
								this.defaultAlign = "l-r";
								if (this.mouseOffset) {
									this.mouseOffset[0] *= -1
								}
							}
							this.anchor = "left";
							return this.getTargetXY()
						}
						if (b[0] + g.width > a) {
							if (this.anchorToTarget) {
								this.defaultAlign = "r-l";
								if (this.mouseOffset) {
									this.mouseOffset[0] *= -1
								}
							}
							this.anchor = "right";
							return this.getTargetXY()
						}
						if (b[1] < j) {
							if (this.anchorToTarget) {
								this.defaultAlign = "t-b";
								if (this.mouseOffset) {
									this.mouseOffset[1] *= -1
								}
							}
							this.anchor = "top";
							return this.getTargetXY()
						}
						if (b[1] + g.height > h) {
							if (this.anchorToTarget) {
								this.defaultAlign = "b-t";
								if (this.mouseOffset) {
									this.mouseOffset[1] *= -1
								}
							}
							this.anchor = "bottom";
							return this.getTargetXY()
						}
					}
					this.anchorCls = "x-tip-anchor-" + this.getAnchorPosition();
					this.anchorEl.addClass(this.anchorCls);
					this.targetCounter = 0;
					return b
				} else {
					var d = this.getMouseOffset();
					return [this.targetXY[0] + d[0], this.targetXY[1] + d[1]]
				}
			},
			getMouseOffset : function () {
				var a = this.anchor ? [0, 0] : [15, 18];
				if (this.mouseOffset) {
					a[0] += this.mouseOffset[0];
					a[1] += this.mouseOffset[1]
				}
				return a
			},
			getAnchorPosition : function () {
				if (this.anchor) {
					this.tipAnchor = this.anchor.charAt(0)
				} else {
					var a = this.defaultAlign.match(/^([a-z]+)-([a-z]+)(\?)?$/);
					if (!a) {
						throw "AnchorTip.defaultAlign is invalid"
					}
					this.tipAnchor = a[1].charAt(0)
				}
				switch (this.tipAnchor) {
				case "t":
					return "top";
				case "b":
					return "bottom";
				case "r":
					return "right"
				}
				return "left"
			},
			getAnchorAlign : function () {
				switch (this.anchor) {
				case "top":
					return "tl-bl";
				case "left":
					return "tl-tr";
				case "right":
					return "tr-tl";
				default:
					return "bl-tl"
				}
			},
			getOffsets : function () {
				var b,
				a = this.getAnchorPosition().charAt(0);
				if (this.anchorToTarget && !this.trackMouse) {
					switch (a) {
					case "t":
						b = [0, 9];
						break;
					case "b":
						b = [0, -13];
						break;
					case "r":
						b = [-13, 0];
						break;
					default:
						b = [9, 0];
						break
					}
				} else {
					switch (a) {
					case "t":
						b = [-15 - this.anchorOffset, 30];
						break;
					case "b":
						b = [-19 - this.anchorOffset, -13 - this.el.dom.offsetHeight];
						break;
					case "r":
						b = [-15 - this.el.dom.offsetWidth, -13 - this.anchorOffset];
						break;
					default:
						b = [25, -13 - this.anchorOffset];
						break
					}
				}
				var c = this.getMouseOffset();
				b[0] += c[0];
				b[1] += c[1];
				return b
			},
			onTargetOver : function (b) {
				if (this.disabled || b.within(this.target.dom, true)) {
					return
				}
				var a = b.getTarget(this.delegate);
				if (a) {
					this.triggerElement = a;
					this.clearTimer("hide");
					this.targetXY = b.getXY();
					this.delayShow()
				}
			},
			delayShow : function () {
				if (this.hidden && !this.showTimer) {
					if (this.lastActive.getElapsed() < this.quickShowInterval) {
						this.show()
					} else {
						this.showTimer = this.show.defer(this.showDelay, this)
					}
				} else {
					if (!this.hidden && this.autoHide !== false) {
						this.show()
					}
				}
			},
			onTargetOut : function (a) {
				if (this.disabled || a.within(this.target.dom, true)) {
					return
				}
				this.clearTimer("show");
				if (this.autoHide !== false) {
					this.delayHide()
				}
			},
			delayHide : function () {
				if (!this.hidden && !this.hideTimer) {
					this.hideTimer = this.hide.defer(this.hideDelay, this)
				}
			},
			hide : function () {
				this.clearTimer("dismiss");
				this.lastActive = new Date();
				if (this.anchorEl) {
					this.anchorEl.hide()
				}
				Ext.ToolTip.superclass.hide.call(this);
				delete this.triggerElement
			},
			show : function () {
				if (this.anchor) {
					this.showAt([-1000, -1000]);
					this.origConstrainPosition = this.constrainPosition;
					this.constrainPosition = false;
					this.anchor = this.origAnchor
				}
				this.showAt(this.getTargetXY());
				if (this.anchor) {
					this.anchorEl.show();
					this.syncAnchor();
					this.constrainPosition = this.origConstrainPosition
				} else {
					this.anchorEl.hide()
				}
			},
			showAt : function (a) {
				this.lastActive = new Date();
				this.clearTimers();
				Ext.ToolTip.superclass.showAt.call(this, a);
				if (this.dismissDelay && this.autoHide !== false) {
					this.dismissTimer = this.hide.defer(this.dismissDelay, this)
				}
				if (this.anchor && !this.anchorEl.isVisible()) {
					this.syncAnchor();
					this.anchorEl.show()
				} else {
					this.anchorEl.hide()
				}
			},
			syncAnchor : function () {
				var a,
				b,
				c;
				switch (this.tipAnchor.charAt(0)) {
				case "t":
					a = "b";
					b = "tl";
					c = [20 + this.anchorOffset, 2];
					break;
				case "r":
					a = "l";
					b = "tr";
					c = [-2, 11 + this.anchorOffset];
					break;
				case "b":
					a = "t";
					b = "bl";
					c = [20 + this.anchorOffset, -2];
					break;
				default:
					a = "r";
					b = "tl";
					c = [2, 11 + this.anchorOffset];
					break
				}
				this.anchorEl.alignTo(this.el, a + "-" + b, c)
			},
			setPagePosition : function (a, b) {
				Ext.ToolTip.superclass.setPagePosition.call(this, a, b);
				if (this.anchor) {
					this.syncAnchor()
				}
			},
			clearTimer : function (a) {
				a = a + "Timer";
				clearTimeout(this[a]);
				delete this[a]
			},
			clearTimers : function () {
				this.clearTimer("show");
				this.clearTimer("dismiss");
				this.clearTimer("hide")
			},
			onShow : function () {
				Ext.ToolTip.superclass.onShow.call(this);
				Ext.getDoc().on("mousedown", this.onDocMouseDown, this)
			},
			onHide : function () {
				Ext.ToolTip.superclass.onHide.call(this);
				Ext.getDoc().un("mousedown", this.onDocMouseDown, this)
			},
			onDocMouseDown : function (a) {
				if (this.autoHide !== true && !this.closable && !a.within(this.el.dom)) {
					this.disable();
					this.doEnable.defer(100, this)
				}
			},
			doEnable : function () {
				if (!this.isDestroyed) {
					this.enable()
				}
			},
			onDisable : function () {
				this.clearTimers();
				this.hide()
			},
			adjustPosition : function (a, d) {
				if (this.constrainPosition) {
					var c = this.targetXY[1],
					b = this.getSize().height;
					if (d <= c && (d + b) >= c) {
						d = c - b - 5
					}
				}
				return {
					x : a,
					y : d
				}
			},
			beforeDestroy : function () {
				this.clearTimers();
				Ext.destroy(this.anchorEl);
				delete this.anchorEl;
				delete this.target;
				delete this.anchorTarget;
				delete this.triggerElement;
				Ext.ToolTip.superclass.beforeDestroy.call(this)
			},
			onDestroy : function () {
				Ext.getDoc().un("mousedown", this.onDocMouseDown, this);
				Ext.ToolTip.superclass.onDestroy.call(this)
			}
		});
Ext.reg("tooltip", Ext.ToolTip);
Ext.QuickTip = Ext.extend(Ext.ToolTip, {
			interceptTitles : false,
			tagConfig : {
				namespace : "ext",
				attribute : "qtip",
				width : "qwidth",
				target : "target",
				title : "qtitle",
				hide : "hide",
				cls : "qclass",
				align : "qalign",
				anchor : "anchor"
			},
			initComponent : function () {
				this.target = this.target || Ext.getDoc();
				this.targets = this.targets || {};
				Ext.QuickTip.superclass.initComponent.call(this)
			},
			register : function (e) {
				var h = Ext.isArray(e) ? e : arguments;
				for (var g = 0, a = h.length; g < a; g++) {
					var l = h[g];
					var k = l.target;
					if (k) {
						if (Ext.isArray(k)) {
							for (var d = 0, b = k.length; d < b; d++) {
								this.targets[Ext.id(k[d])] = l
							}
						} else {
							this.targets[Ext.id(k)] = l
						}
					}
				}
			},
			unregister : function (a) {
				delete this.targets[Ext.id(a)]
			},
			cancelShow : function (b) {
				var a = this.activeTarget;
				b = Ext.get(b).dom;
				if (this.isVisible()) {
					if (a && a.el == b) {
						this.hide()
					}
				} else {
					if (a && a.el == b) {
						this.clearTimer("show")
					}
				}
			},
			getTipCfg : function (d) {
				var b = d.getTarget(),
				c,
				a;
				if (this.interceptTitles && b.title && Ext.isString(b.title)) {
					c = b.title;
					b.qtip = c;
					b.removeAttribute("title");
					d.preventDefault()
				} else {
					a = this.tagConfig;
					c = b.qtip || Ext.fly(b).getAttribute(a.attribute, a.namespace)
				}
				return c
			},
			onTargetOver : function (i) {
				if (this.disabled) {
					return
				}
				this.targetXY = i.getXY();
				var c = i.getTarget();
				if (!c || c.nodeType !== 1 || c == document || c == document.body) {
					return
				}
				if (this.activeTarget && ((c == this.activeTarget.el) || Ext.fly(this.activeTarget.el).contains(c))) {
					this.clearTimer("hide");
					this.show();
					return
				}
				if (c && this.targets[c.id]) {
					this.activeTarget = this.targets[c.id];
					this.activeTarget.el = c;
					this.anchor = this.activeTarget.anchor;
					if (this.anchor) {
						this.anchorTarget = c
					}
					this.delayShow();
					return
				}
				var g,
				h = Ext.fly(c),
				b = this.tagConfig,
				d = b.namespace;
				if (g = this.getTipCfg(i)) {
					var a = h.getAttribute(b.hide, d);
					this.activeTarget = {
						el : c,
						text : g,
						width : h.getAttribute(b.width, d),
						autoHide : a != "user" && a !== "false",
						title : h.getAttribute(b.title, d),
						cls : h.getAttribute(b.cls, d),
						align : h.getAttribute(b.align, d)
					};
					this.anchor = h.getAttribute(b.anchor, d);
					if (this.anchor) {
						this.anchorTarget = c
					}
					this.delayShow()
				}
			},
			onTargetOut : function (a) {
				if (this.activeTarget && a.within(this.activeTarget.el) && !this.getTipCfg(a)) {
					return
				}
				this.clearTimer("show");
				if (this.autoHide !== false) {
					this.delayHide()
				}
			},
			showAt : function (b) {
				var a = this.activeTarget;
				if (a) {
					if (!this.rendered) {
						this.render(Ext.getBody());
						this.activeTarget = a
					}
					if (a.width) {
						this.setWidth(a.width);
						this.body.setWidth(this.adjustBodyWidth(a.width - this.getFrameWidth()));
						this.measureWidth = false
					} else {
						this.measureWidth = true
					}
					this.setTitle(a.title || "");
					this.body.update(a.text);
					this.autoHide = a.autoHide;
					this.dismissDelay = a.dismissDelay || this.dismissDelay;
					if (this.lastCls) {
						this.el.removeClass(this.lastCls);
						delete this.lastCls
					}
					if (a.cls) {
						this.el.addClass(a.cls);
						this.lastCls = a.cls
					}
					if (this.anchor) {
						this.constrainPosition = false
					} else {
						if (a.align) {
							b = this.el.getAlignToXY(a.el, a.align);
							this.constrainPosition = false
						} else {
							this.constrainPosition = true
						}
					}
				}
				Ext.QuickTip.superclass.showAt.call(this, b)
			},
			hide : function () {
				delete this.activeTarget;
				Ext.QuickTip.superclass.hide.call(this)
			}
		});
Ext.reg("quicktip", Ext.QuickTip);
Ext.QuickTips = function () {
	var b,
	a = false;
	return {
		init : function (c) {
			if (!b) {
				if (!Ext.isReady) {
					Ext.onReady(function () {
							Ext.QuickTips.init(c)
						});
					return
				}
				b = new Ext.QuickTip({
							elements : "header,body",
							disabled : a
						});
				if (c !== false) {
					b.render(Ext.getBody())
				}
			}
		},
		ddDisable : function () {
			if (b && !a) {
				b.disable()
			}
		},
		ddEnable : function () {
			if (b && !a) {
				b.enable()
			}
		},
		enable : function () {
			if (b) {
				b.enable()
			}
			a = false
		},
		disable : function () {
			if (b) {
				b.disable()
			}
			a = true
		},
		isEnabled : function () {
			return b !== undefined && !b.disabled
		},
		getQuickTip : function () {
			return b
		},
		register : function () {
			b.register.apply(b, arguments)
		},
		unregister : function () {
			b.unregister.apply(b, arguments)
		},
		tips : function () {
			b.register.apply(b, arguments)
		}
	}
}
();
Ext.slider.Tip = Ext.extend(Ext.Tip, {
			minWidth : 10,
			offsets : [0, -10],
			init : function (a) {
				a.on({
						scope : this,
						dragstart : this.onSlide,
						drag : this.onSlide,
						dragend : this.hide,
						destroy : this.destroy
					})
			},
			onSlide : function (b, c, a) {
				this.show();
				this.body.update(this.getText(a));
				this.doAutoWidth();
				this.el.alignTo(a.el, "b-t?", this.offsets)
			},
			getText : function (a) {
				return String(a.value)
			}
		});
Ext.ux.SliderTip = Ext.slider.Tip;
Ext.tree.TreePanel = Ext.extend(Ext.Panel, {
			rootVisible : true,
			animate : Ext.enableFx,
			lines : true,
			enableDD : false,
			hlDrop : Ext.enableFx,
			pathSeparator : "/",
			bubbleEvents : [],
			initComponent : function () {
				Ext.tree.TreePanel.superclass.initComponent.call(this);
				if (!this.eventModel) {
					this.eventModel = new Ext.tree.TreeEventModel(this)
				}
				var a = this.loader;
				if (!a) {
					a = new Ext.tree.TreeLoader({
								dataUrl : this.dataUrl,
								requestMethod : this.requestMethod
							})
				} else {
					if (Ext.isObject(a) && !a.load) {
						a = new Ext.tree.TreeLoader(a)
					}
				}
				this.loader = a;
				this.nodeHash = {};
				if (this.root) {
					var b = this.root;
					delete this.root;
					this.setRootNode(b)
				}
				this.addEvents("append", "remove", "movenode", "insert", "beforeappend", "beforeremove", "beforemovenode", "beforeinsert", "beforeload", "load", "textchange", "beforeexpandnode", "beforecollapsenode", "expandnode", "disabledchange", "collapsenode", "beforeclick", "click", "containerclick", "checkchange", "beforedblclick", "dblclick", "containerdblclick", "contextmenu", "containercontextmenu", "beforechildrenrendered", "startdrag", "enddrag", "dragdrop", "beforenodedrop", "nodedrop", "nodedragover");
				if (this.singleExpand) {
					this.on("beforeexpandnode", this.restrictExpand, this)
				}
			},
			proxyNodeEvent : function (c, b, a, h, g, e, d) {
				if (c == "collapse" || c == "expand" || c == "beforecollapse" || c == "beforeexpand" || c == "move" || c == "beforemove") {
					c = c + "node"
				}
				return this.fireEvent(c, b, a, h, g, e, d)
			},
			getRootNode : function () {
				return this.root
			},
			setRootNode : function (b) {
				this.destroyRoot();
				if (!b.render) {
					b = this.loader.createNode(b)
				}
				this.root = b;
				b.ownerTree = this;
				b.isRoot = true;
				this.registerNode(b);
				if (!this.rootVisible) {
					var a = b.attributes.uiProvider;
					b.ui = a ? new a(b) : new Ext.tree.RootTreeNodeUI(b)
				}
				if (this.innerCt) {
					this.clearInnerCt();
					this.renderRoot()
				}
				return b
			},
			clearInnerCt : function () {
				this.innerCt.update("")
			},
			renderRoot : function () {
				this.root.render();
				if (!this.rootVisible) {
					this.root.renderChildren()
				}
			},
			getNodeById : function (a) {
				return this.nodeHash[a]
			},
			registerNode : function (a) {
				this.nodeHash[a.id] = a
			},
			unregisterNode : function (a) {
				delete this.nodeHash[a.id]
			},
			toString : function () {
				return "[Tree" + (this.id ? " " + this.id : "") + "]"
			},
			restrictExpand : function (a) {
				var b = a.parentNode;
				if (b) {
					if (b.expandedChild && b.expandedChild.parentNode == b) {
						b.expandedChild.collapse()
					}
					b.expandedChild = a
				}
			},
			getChecked : function (b, c) {
				c = c || this.root;
				var d = [];
				var e = function () {
					if (this.attributes.checked) {
						d.push(!b ? this : (b == "id" ? this.id : this.attributes[b]))
					}
				};
				c.cascade(e);
				return d
			},
			getLoader : function () {
				return this.loader
			},
			expandAll : function () {
				this.root.expand(true)
			},
			collapseAll : function () {
				this.root.collapse(true)
			},
			getSelectionModel : function () {
				if (!this.selModel) {
					this.selModel = new Ext.tree.DefaultSelectionModel()
				}
				return this.selModel
			},
			expandPath : function (g, a, h) {
				if (Ext.isEmpty(g)) {
					if (h) {
						h(false, undefined)
					}
					return
				}
				a = a || "id";
				var d = g.split(this.pathSeparator);
				var c = this.root;
				if (c.attributes[a] != d[1]) {
					if (h) {
						h(false, null)
					}
					return
				}
				var b = 1;
				var e = function () {
					if (++b == d.length) {
						if (h) {
							h(true, c)
						}
						return
					}
					var i = c.findChild(a, d[b]);
					if (!i) {
						if (h) {
							h(false, c)
						}
						return
					}
					c = i;
					i.expand(false, false, e)
				};
				c.expand(false, false, e)
			},
			selectPath : function (e, a, g) {
				if (Ext.isEmpty(e)) {
					if (g) {
						g(false, undefined)
					}
					return
				}
				a = a || "id";
				var c = e.split(this.pathSeparator),
				b = c.pop();
				if (c.length > 1) {
					var d = function (i, h) {
						if (i && h) {
							var j = h.findChild(a, b);
							if (j) {
								j.select();
								if (g) {
									g(true, j)
								}
							} else {
								if (g) {
									g(false, j)
								}
							}
						} else {
							if (g) {
								g(false, j)
							}
						}
					};
					this.expandPath(c.join(this.pathSeparator), a, d)
				} else {
					this.root.select();
					if (g) {
						g(true, this.root)
					}
				}
			},
			getTreeEl : function () {
				return this.body
			},
			onRender : function (b, a) {
				Ext.tree.TreePanel.superclass.onRender.call(this, b, a);
				this.el.addClass("x-tree");
				this.innerCt = this.body.createChild({
							tag : "ul",
							cls : "x-tree-root-ct " + (this.useArrows ? "x-tree-arrows" : this.lines ? "x-tree-lines" : "x-tree-no-lines")
						})
			},
			initEvents : function () {
				Ext.tree.TreePanel.superclass.initEvents.call(this);
				if (this.containerScroll) {
					Ext.dd.ScrollManager.register(this.body)
				}
				if ((this.enableDD || this.enableDrop) && !this.dropZone) {
					this.dropZone = new Ext.tree.TreeDropZone(this, this.dropConfig || {
								ddGroup : this.ddGroup || "TreeDD",
								appendOnly : this.ddAppendOnly === true
							})
				}
				if ((this.enableDD || this.enableDrag) && !this.dragZone) {
					this.dragZone = new Ext.tree.TreeDragZone(this, this.dragConfig || {
								ddGroup : this.ddGroup || "TreeDD",
								scroll : this.ddScroll
							})
				}
				this.getSelectionModel().init(this)
			},
			afterRender : function () {
				Ext.tree.TreePanel.superclass.afterRender.call(this);
				this.renderRoot()
			},
			beforeDestroy : function () {
				if (this.rendered) {
					Ext.dd.ScrollManager.unregister(this.body);
					Ext.destroy(this.dropZone, this.dragZone)
				}
				this.destroyRoot();
				Ext.destroy(this.loader);
				this.nodeHash = this.root = this.loader = null;
				Ext.tree.TreePanel.superclass.beforeDestroy.call(this)
			},
			destroyRoot : function () {
				if (this.root && this.root.destroy) {
					this.root.destroy(true)
				}
			}
		});
Ext.tree.TreePanel.nodeTypes = {};
Ext.reg("treepanel", Ext.tree.TreePanel);
Ext.tree.TreeEventModel = function (a) {
	this.tree = a;
	this.tree.on("render", this.initEvents, this)
};
Ext.tree.TreeEventModel.prototype = {
	initEvents : function () {
		var a = this.tree;
		if (a.trackMouseOver !== false) {
			a.mon(a.innerCt, {
					scope : this,
					mouseover : this.delegateOver,
					mouseout : this.delegateOut
				})
		}
		a.mon(a.getTreeEl(), {
				scope : this,
				click : this.delegateClick,
				dblclick : this.delegateDblClick,
				contextmenu : this.delegateContextMenu
			})
	},
	getNode : function (b) {
		var a;
		if (a = b.getTarget(".x-tree-node-el", 10)) {
			var c = Ext.fly(a, "_treeEvents").getAttribute("tree-node-id", "ext");
			if (c) {
				return this.tree.getNodeById(c)
			}
		}
		return null
	},
	getNodeTarget : function (b) {
		var a = b.getTarget(".x-tree-node-icon", 1);
		if (!a) {
			a = b.getTarget(".x-tree-node-el", 6)
		}
		return a
	},
	delegateOut : function (b, a) {
		if (!this.beforeEvent(b)) {
			return
		}
		if (b.getTarget(".x-tree-ec-icon", 1)) {
			var c = this.getNode(b);
			this.onIconOut(b, c);
			if (c == this.lastEcOver) {
				delete this.lastEcOver
			}
		}
		if ((a = this.getNodeTarget(b)) && !b.within(a, true)) {
			this.onNodeOut(b, this.getNode(b))
		}
	},
	delegateOver : function (b, a) {
		if (!this.beforeEvent(b)) {
			return
		}
		if (Ext.isGecko && !this.trackingDoc) {
			Ext.getBody().on("mouseover", this.trackExit, this);
			this.trackingDoc = true
		}
		if (this.lastEcOver) {
			this.onIconOut(b, this.lastEcOver);
			delete this.lastEcOver
		}
		if (b.getTarget(".x-tree-ec-icon", 1)) {
			this.lastEcOver = this.getNode(b);
			this.onIconOver(b, this.lastEcOver)
		}
		if (a = this.getNodeTarget(b)) {
			this.onNodeOver(b, this.getNode(b))
		}
	},
	trackExit : function (a) {
		if (this.lastOverNode) {
			if (this.lastOverNode.ui && !a.within(this.lastOverNode.ui.getEl())) {
				this.onNodeOut(a, this.lastOverNode)
			}
			delete this.lastOverNode;
			Ext.getBody().un("mouseover", this.trackExit, this);
			this.trackingDoc = false
		}
	},
	delegateClick : function (b, a) {
		if (this.beforeEvent(b)) {
			if (b.getTarget("input[type=checkbox]", 1)) {
				this.onCheckboxClick(b, this.getNode(b))
			} else {
				if (b.getTarget(".x-tree-ec-icon", 1)) {
					this.onIconClick(b, this.getNode(b))
				} else {
					if (this.getNodeTarget(b)) {
						this.onNodeClick(b, this.getNode(b))
					}
				}
			}
		} else {
			this.checkContainerEvent(b, "click")
		}
	},
	delegateDblClick : function (b, a) {
		if (this.beforeEvent(b)) {
			if (this.getNodeTarget(b)) {
				this.onNodeDblClick(b, this.getNode(b))
			}
		} else {
			this.checkContainerEvent(b, "dblclick")
		}
	},
	delegateContextMenu : function (b, a) {
		if (this.beforeEvent(b)) {
			if (this.getNodeTarget(b)) {
				this.onNodeContextMenu(b, this.getNode(b))
			}
		} else {
			this.checkContainerEvent(b, "contextmenu")
		}
	},
	checkContainerEvent : function (b, a) {
		if (this.disabled) {
			b.stopEvent();
			return false
		}
		this.onContainerEvent(b, a)
	},
	onContainerEvent : function (b, a) {
		this.tree.fireEvent("container" + a, this.tree, b)
	},
	onNodeClick : function (b, a) {
		a.ui.onClick(b)
	},
	onNodeOver : function (b, a) {
		this.lastOverNode = a;
		a.ui.onOver(b)
	},
	onNodeOut : function (b, a) {
		a.ui.onOut(b)
	},
	onIconOver : function (b, a) {
		a.ui.addClass("x-tree-ec-over")
	},
	onIconOut : function (b, a) {
		a.ui.removeClass("x-tree-ec-over")
	},
	onIconClick : function (b, a) {
		a.ui.ecClick(b)
	},
	onCheckboxClick : function (b, a) {
		a.ui.onCheckChange(b)
	},
	onNodeDblClick : function (b, a) {
		a.ui.onDblClick(b)
	},
	onNodeContextMenu : function (b, a) {
		a.ui.onContextMenu(b)
	},
	beforeEvent : function (b) {
		var a = this.getNode(b);
		if (this.disabled || !a || !a.ui) {
			b.stopEvent();
			return false
		}
		return true
	},
	disable : function () {
		this.disabled = true
	},
	enable : function () {
		this.disabled = false
	}
};
Ext.tree.DefaultSelectionModel = Ext.extend(Ext.util.Observable, {
			constructor : function (a) {
				this.selNode = null;
				this.addEvents("selectionchange", "beforeselect");
				Ext.apply(this, a);
				Ext.tree.DefaultSelectionModel.superclass.constructor.call(this)
			},
			init : function (a) {
				this.tree = a;
				a.mon(a.getTreeEl(), "keydown", this.onKeyDown, this);
				a.on("click", this.onNodeClick, this)
			},
			onNodeClick : function (a, b) {
				this.select(a)
			},
			select : function (c, a) {
				if (!Ext.fly(c.ui.wrap).isVisible() && a) {
					return a.call(this, c)
				}
				var b = this.selNode;
				if (c == b) {
					c.ui.onSelectedChange(true)
				} else {
					if (this.fireEvent("beforeselect", this, c, b) !== false) {
						if (b && b.ui) {
							b.ui.onSelectedChange(false)
						}
						this.selNode = c;
						c.ui.onSelectedChange(true);
						this.fireEvent("selectionchange", this, c, b)
					}
				}
				return c
			},
			unselect : function (b, a) {
				if (this.selNode == b) {
					this.clearSelections(a)
				}
			},
			clearSelections : function (a) {
				var b = this.selNode;
				if (b) {
					b.ui.onSelectedChange(false);
					this.selNode = null;
					if (a !== true) {
						this.fireEvent("selectionchange", this, null)
					}
				}
				return b
			},
			getSelectedNode : function () {
				return this.selNode
			},
			isSelected : function (a) {
				return this.selNode == a
			},
			selectPrevious : function (a) {
				if (!(a = a || this.selNode || this.lastSelNode)) {
					return null
				}
				var c = a.previousSibling;
				if (c) {
					if (!c.isExpanded() || c.childNodes.length < 1) {
						return this.select(c, this.selectPrevious)
					} else {
						var b = c.lastChild;
						while (b && b.isExpanded() && Ext.fly(b.ui.wrap).isVisible() && b.childNodes.length > 0) {
							b = b.lastChild
						}
						return this.select(b, this.selectPrevious)
					}
				} else {
					if (a.parentNode && (this.tree.rootVisible || !a.parentNode.isRoot)) {
						return this.select(a.parentNode, this.selectPrevious)
					}
				}
				return null
			},
			selectNext : function (b) {
				if (!(b = b || this.selNode || this.lastSelNode)) {
					return null
				}
				if (b.firstChild && b.isExpanded() && Ext.fly(b.ui.wrap).isVisible()) {
					return this.select(b.firstChild, this.selectNext)
				} else {
					if (b.nextSibling) {
						return this.select(b.nextSibling, this.selectNext)
					} else {
						if (b.parentNode) {
							var a = null;
							b.parentNode.bubble(function () {
									if (this.nextSibling) {
										a = this.getOwnerTree().selModel.select(this.nextSibling, this.selectNext);
										return false
									}
								});
							return a
						}
					}
				}
				return null
			},
			onKeyDown : function (c) {
				var b = this.selNode || this.lastSelNode;
				var d = this;
				if (!b) {
					return
				}
				var a = c.getKey();
				switch (a) {
				case c.DOWN:
					c.stopEvent();
					this.selectNext();
					break;
				case c.UP:
					c.stopEvent();
					this.selectPrevious();
					break;
				case c.RIGHT:
					c.preventDefault();
					if (b.hasChildNodes()) {
						if (!b.isExpanded()) {
							b.expand()
						} else {
							if (b.firstChild) {
								this.select(b.firstChild, c)
							}
						}
					}
					break;
				case c.LEFT:
					c.preventDefault();
					if (b.hasChildNodes() && b.isExpanded()) {
						b.collapse()
					} else {
						if (b.parentNode && (this.tree.rootVisible || b.parentNode != this.tree.getRootNode())) {
							this.select(b.parentNode, c)
						}
					}
					break
				}
			}
		});
Ext.tree.MultiSelectionModel = Ext.extend(Ext.util.Observable, {
			constructor : function (a) {
				this.selNodes = [];
				this.selMap = {};
				this.addEvents("selectionchange");
				Ext.apply(this, a);
				Ext.tree.MultiSelectionModel.superclass.constructor.call(this)
			},
			init : function (a) {
				this.tree = a;
				a.mon(a.getTreeEl(), "keydown", this.onKeyDown, this);
				a.on("click", this.onNodeClick, this)
			},
			onNodeClick : function (a, b) {
				if (b.ctrlKey && this.isSelected(a)) {
					this.unselect(a)
				} else {
					this.select(a, b, b.ctrlKey)
				}
			},
			select : function (a, c, b) {
				if (b !== true) {
					this.clearSelections(true)
				}
				if (this.isSelected(a)) {
					this.lastSelNode = a;
					return a
				}
				this.selNodes.push(a);
				this.selMap[a.id] = a;
				this.lastSelNode = a;
				a.ui.onSelectedChange(true);
				this.fireEvent("selectionchange", this, this.selNodes);
				return a
			},
			unselect : function (b) {
				if (this.selMap[b.id]) {
					b.ui.onSelectedChange(false);
					var c = this.selNodes;
					var a = c.indexOf(b);
					if (a != -1) {
						this.selNodes.splice(a, 1)
					}
					delete this.selMap[b.id];
					this.fireEvent("selectionchange", this, this.selNodes)
				}
			},
			clearSelections : function (b) {
				var d = this.selNodes;
				if (d.length > 0) {
					for (var c = 0, a = d.length; c < a; c++) {
						d[c].ui.onSelectedChange(false)
					}
					this.selNodes = [];
					this.selMap = {};
					if (b !== true) {
						this.fireEvent("selectionchange", this, this.selNodes)
					}
				}
			},
			isSelected : function (a) {
				return this.selMap[a.id] ? true : false
			},
			getSelectedNodes : function () {
				return this.selNodes.concat([])
			},
			onKeyDown : Ext.tree.DefaultSelectionModel.prototype.onKeyDown,
			selectNext : Ext.tree.DefaultSelectionModel.prototype.selectNext,
			selectPrevious : Ext.tree.DefaultSelectionModel.prototype.selectPrevious
		});
Ext.data.Tree = Ext.extend(Ext.util.Observable, {
			constructor : function (a) {
				this.nodeHash = {};
				this.root = null;
				if (a) {
					this.setRootNode(a)
				}
				this.addEvents("append", "remove", "move", "insert", "beforeappend", "beforeremove", "beforemove", "beforeinsert");
				Ext.data.Tree.superclass.constructor.call(this)
			},
			pathSeparator : "/",
			proxyNodeEvent : function () {
				return this.fireEvent.apply(this, arguments)
			},
			getRootNode : function () {
				return this.root
			},
			setRootNode : function (a) {
				this.root = a;
				a.ownerTree = this;
				a.isRoot = true;
				this.registerNode(a);
				return a
			},
			getNodeById : function (a) {
				return this.nodeHash[a]
			},
			registerNode : function (a) {
				this.nodeHash[a.id] = a
			},
			unregisterNode : function (a) {
				delete this.nodeHash[a.id]
			},
			toString : function () {
				return "[Tree" + (this.id ? " " + this.id : "") + "]"
			}
		});
Ext.data.Node = Ext.extend(Ext.util.Observable, {
			constructor : function (a) {
				this.attributes = a || {};
				this.leaf = this.attributes.leaf;
				this.id = this.attributes.id;
				if (!this.id) {
					this.id = Ext.id(null, "xnode-");
					this.attributes.id = this.id
				}
				this.childNodes = [];
				this.parentNode = null;
				this.firstChild = null;
				this.lastChild = null;
				this.previousSibling = null;
				this.nextSibling = null;
				this.addEvents({
						append : true,
						remove : true,
						move : true,
						insert : true,
						beforeappend : true,
						beforeremove : true,
						beforemove : true,
						beforeinsert : true
					});
				this.listeners = this.attributes.listeners;
				Ext.data.Node.superclass.constructor.call(this)
			},
			fireEvent : function (b) {
				if (Ext.data.Node.superclass.fireEvent.apply(this, arguments) === false) {
					return false
				}
				var a = this.getOwnerTree();
				if (a) {
					if (a.proxyNodeEvent.apply(a, arguments) === false) {
						return false
					}
				}
				return true
			},
			isLeaf : function () {
				return this.leaf === true
			},
			setFirstChild : function (a) {
				this.firstChild = a
			},
			setLastChild : function (a) {
				this.lastChild = a
			},
			isLast : function () {
				return (!this.parentNode ? true : this.parentNode.lastChild == this)
			},
			isFirst : function () {
				return (!this.parentNode ? true : this.parentNode.firstChild == this)
			},
			hasChildNodes : function () {
				return !this.isLeaf() && this.childNodes.length > 0
			},
			isExpandable : function () {
				return this.attributes.expandable || this.hasChildNodes()
			},
			appendChild : function (e) {
				var g = false;
				if (Ext.isArray(e)) {
					g = e
				} else {
					if (arguments.length > 1) {
						g = arguments
					}
				}
				if (g) {
					for (var d = 0, a = g.length; d < a; d++) {
						this.appendChild(g[d])
					}
				} else {
					if (this.fireEvent("beforeappend", this.ownerTree, this, e) === false) {
						return false
					}
					var b = this.childNodes.length;
					var c = e.parentNode;
					if (c) {
						if (e.fireEvent("beforemove", e.getOwnerTree(), e, c, this, b) === false) {
							return false
						}
						c.removeChild(e)
					}
					b = this.childNodes.length;
					if (b === 0) {
						this.setFirstChild(e)
					}
					this.childNodes.push(e);
					e.parentNode = this;
					var h = this.childNodes[b - 1];
					if (h) {
						e.previousSibling = h;
						h.nextSibling = e
					} else {
						e.previousSibling = null
					}
					e.nextSibling = null;
					this.setLastChild(e);
					e.setOwnerTree(this.getOwnerTree());
					this.fireEvent("append", this.ownerTree, this, e, b);
					if (c) {
						e.fireEvent("move", this.ownerTree, e, c, this, b)
					}
					return e
				}
			},
			removeChild : function (c, b) {
				var a = this.childNodes.indexOf(c);
				if (a == -1) {
					return false
				}
				if (this.fireEvent("beforeremove", this.ownerTree, this, c) === false) {
					return false
				}
				this.childNodes.splice(a, 1);
				if (c.previousSibling) {
					c.previousSibling.nextSibling = c.nextSibling
				}
				if (c.nextSibling) {
					c.nextSibling.previousSibling = c.previousSibling
				}
				if (this.firstChild == c) {
					this.setFirstChild(c.nextSibling)
				}
				if (this.lastChild == c) {
					this.setLastChild(c.previousSibling)
				}
				this.fireEvent("remove", this.ownerTree, this, c);
				if (b) {
					c.destroy(true)
				} else {
					c.clear()
				}
				return c
			},
			clear : function (a) {
				this.setOwnerTree(null, a);
				this.parentNode = this.previousSibling = this.nextSibling = null;
				if (a) {
					this.firstChild = this.lastChild = null
				}
			},
			destroy : function (a) {
				if (a === true) {
					this.purgeListeners();
					this.clear(true);
					Ext.each(this.childNodes, function (b) {
							b.destroy(true)
						});
					this.childNodes = null
				} else {
					this.remove(true)
				}
			},
			insertBefore : function (d, a) {
				if (!a) {
					return this.appendChild(d)
				}
				if (d == a) {
					return false
				}
				if (this.fireEvent("beforeinsert", this.ownerTree, this, d, a) === false) {
					return false
				}
				var b = this.childNodes.indexOf(a);
				var c = d.parentNode;
				var e = b;
				if (c == this && this.childNodes.indexOf(d) < b) {
					e--
				}
				if (c) {
					if (d.fireEvent("beforemove", d.getOwnerTree(), d, c, this, b, a) === false) {
						return false
					}
					c.removeChild(d)
				}
				if (e === 0) {
					this.setFirstChild(d)
				}
				this.childNodes.splice(e, 0, d);
				d.parentNode = this;
				var g = this.childNodes[e - 1];
				if (g) {
					d.previousSibling = g;
					g.nextSibling = d
				} else {
					d.previousSibling = null
				}
				d.nextSibling = a;
				a.previousSibling = d;
				d.setOwnerTree(this.getOwnerTree());
				this.fireEvent("insert", this.ownerTree, this, d, a);
				if (c) {
					d.fireEvent("move", this.ownerTree, d, c, this, e, a)
				}
				return d
			},
			remove : function (a) {
				if (this.parentNode) {
					this.parentNode.removeChild(this, a)
				}
				return this
			},
			removeAll : function (a) {
				var c = this.childNodes,
				b;
				while ((b = c[0])) {
					this.removeChild(b, a)
				}
				return this
			},
			item : function (a) {
				return this.childNodes[a]
			},
			replaceChild : function (a, c) {
				var b = c ? c.nextSibling : null;
				this.removeChild(c);
				this.insertBefore(a, b);
				return c
			},
			indexOf : function (a) {
				return this.childNodes.indexOf(a)
			},
			getOwnerTree : function () {
				if (!this.ownerTree) {
					var a = this;
					while (a) {
						if (a.ownerTree) {
							this.ownerTree = a.ownerTree;
							break
						}
						a = a.parentNode
					}
				}
				return this.ownerTree
			},
			getDepth : function () {
				var b = 0;
				var a = this;
				while (a.parentNode) {
					++b;
					a = a.parentNode
				}
				return b
			},
			setOwnerTree : function (a, b) {
				if (a != this.ownerTree) {
					if (this.ownerTree) {
						this.ownerTree.unregisterNode(this)
					}
					this.ownerTree = a;
					if (b !== true) {
						Ext.each(this.childNodes, function (c) {
								c.setOwnerTree(a)
							})
					}
					if (a) {
						a.registerNode(this)
					}
				}
			},
			setId : function (b) {
				if (b !== this.id) {
					var a = this.ownerTree;
					if (a) {
						a.unregisterNode(this)
					}
					this.id = this.attributes.id = b;
					if (a) {
						a.registerNode(this)
					}
					this.onIdChange(b)
				}
			},
			onIdChange : Ext.emptyFn,
			getPath : function (c) {
				c = c || "id";
				var e = this.parentNode;
				var a = [this.attributes[c]];
				while (e) {
					a.unshift(e.attributes[c]);
					e = e.parentNode
				}
				var d = this.getOwnerTree().pathSeparator;
				return d + a.join(d)
			},
			bubble : function (c, b, a) {
				var d = this;
				while (d) {
					if (c.apply(b || d, a || [d]) === false) {
						break
					}
					d = d.parentNode
				}
			},
			cascade : function (g, e, b) {
				if (g.apply(e || this, b || [this]) !== false) {
					var d = this.childNodes;
					for (var c = 0, a = d.length; c < a; c++) {
						d[c].cascade(g, e, b)
					}
				}
			},
			eachChild : function (g, e, b) {
				var d = this.childNodes;
				for (var c = 0, a = d.length; c < a; c++) {
					if (g.apply(e || d[c], b || [d[c]]) === false) {
						break
					}
				}
			},
			findChild : function (b, c, a) {
				return this.findChildBy(function () {
						return this.attributes[b] == c
					}, null, a)
			},
			findChildBy : function (h, g, b) {
				var e = this.childNodes,
				a = e.length,
				d = 0,
				j,
				c;
				for (; d < a; d++) {
					j = e[d];
					if (h.call(g || j, j) === true) {
						return j
					} else {
						if (b) {
							c = j.findChildBy(h, g, b);
							if (c != null) {
								return c
							}
						}
					}
				}
				return null
			},
			sort : function (e, d) {
				var c = this.childNodes;
				var a = c.length;
				if (a > 0) {
					var g = d ? function () {
						e.apply(d, arguments)
					}
					 : e;
					c.sort(g);
					for (var b = 0; b < a; b++) {
						var h = c[b];
						h.previousSibling = c[b - 1];
						h.nextSibling = c[b + 1];
						if (b === 0) {
							this.setFirstChild(h)
						}
						if (b == a - 1) {
							this.setLastChild(h)
						}
					}
				}
			},
			contains : function (a) {
				return a.isAncestor(this)
			},
			isAncestor : function (a) {
				var b = this.parentNode;
				while (b) {
					if (b == a) {
						return true
					}
					b = b.parentNode
				}
				return false
			},
			toString : function () {
				return "[Node" + (this.id ? " " + this.id : "") + "]"
			}
		});
Ext.tree.TreeNode = Ext.extend(Ext.data.Node, {
			constructor : function (a) {
				a = a || {};
				if (Ext.isString(a)) {
					a = {
						text : a
					}
				}
				this.childrenRendered = false;
				this.rendered = false;
				Ext.tree.TreeNode.superclass.constructor.call(this, a);
				this.expanded = a.expanded === true;
				this.isTarget = a.isTarget !== false;
				this.draggable = a.draggable !== false && a.allowDrag !== false;
				this.allowChildren = a.allowChildren !== false && a.allowDrop !== false;
				this.text = a.text;
				this.disabled = a.disabled === true;
				this.hidden = a.hidden === true;
				this.addEvents("textchange", "beforeexpand", "beforecollapse", "expand", "disabledchange", "collapse", "beforeclick", "click", "checkchange", "beforedblclick", "dblclick", "contextmenu", "beforechildrenrendered");
				var b = this.attributes.uiProvider || this.defaultUI || Ext.tree.TreeNodeUI;
				this.ui = new b(this)
			},
			preventHScroll : true,
			isExpanded : function () {
				return this.expanded
			},
			getUI : function () {
				return this.ui
			},
			getLoader : function () {
				var a;
				return this.loader || ((a = this.getOwnerTree()) && a.loader ? a.loader : (this.loader = new Ext.tree.TreeLoader()))
			},
			setFirstChild : function (a) {
				var b = this.firstChild;
				Ext.tree.TreeNode.superclass.setFirstChild.call(this, a);
				if (this.childrenRendered && b && a != b) {
					b.renderIndent(true, true)
				}
				if (this.rendered) {
					this.renderIndent(true, true)
				}
			},
			setLastChild : function (b) {
				var a = this.lastChild;
				Ext.tree.TreeNode.superclass.setLastChild.call(this, b);
				if (this.childrenRendered && a && b != a) {
					a.renderIndent(true, true)
				}
				if (this.rendered) {
					this.renderIndent(true, true)
				}
			},
			appendChild : function (b) {
				if (!b.render && !Ext.isArray(b)) {
					b = this.getLoader().createNode(b)
				}
				var a = Ext.tree.TreeNode.superclass.appendChild.call(this, b);
				if (a && this.childrenRendered) {
					a.render()
				}
				this.ui.updateExpandIcon();
				return a
			},
			removeChild : function (b, a) {
				this.ownerTree.getSelectionModel().unselect(b);
				Ext.tree.TreeNode.superclass.removeChild.apply(this, arguments);
				if (!a) {
					var c = b.ui.rendered;
					if (c) {
						b.ui.remove()
					}
					if (c && this.childNodes.length < 1) {
						this.collapse(false, false)
					} else {
						this.ui.updateExpandIcon()
					}
					if (!this.firstChild && !this.isHiddenRoot()) {
						this.childrenRendered = false
					}
				}
				return b
			},
			insertBefore : function (c, a) {
				if (!c.render) {
					c = this.getLoader().createNode(c)
				}
				var b = Ext.tree.TreeNode.superclass.insertBefore.call(this, c, a);
				if (b && a && this.childrenRendered) {
					c.render()
				}
				this.ui.updateExpandIcon();
				return b
			},
			setText : function (b) {
				var a = this.text;
				this.text = this.attributes.text = b;
				if (this.rendered) {
					this.ui.onTextChange(this, b, a)
				}
				this.fireEvent("textchange", this, b, a)
			},
			setIconCls : function (b) {
				var a = this.attributes.iconCls;
				this.attributes.iconCls = b;
				if (this.rendered) {
					this.ui.onIconClsChange(this, b, a)
				}
			},
			setTooltip : function (a, b) {
				this.attributes.qtip = a;
				this.attributes.qtipTitle = b;
				if (this.rendered) {
					this.ui.onTipChange(this, a, b)
				}
			},
			setIcon : function (a) {
				this.attributes.icon = a;
				if (this.rendered) {
					this.ui.onIconChange(this, a)
				}
			},
			setHref : function (a, b) {
				this.attributes.href = a;
				this.attributes.hrefTarget = b;
				if (this.rendered) {
					this.ui.onHrefChange(this, a, b)
				}
			},
			setCls : function (b) {
				var a = this.attributes.cls;
				this.attributes.cls = b;
				if (this.rendered) {
					this.ui.onClsChange(this, b, a)
				}
			},
			select : function () {
				var a = this.getOwnerTree();
				if (a) {
					a.getSelectionModel().select(this)
				}
			},
			unselect : function (a) {
				var b = this.getOwnerTree();
				if (b) {
					b.getSelectionModel().unselect(this, a)
				}
			},
			isSelected : function () {
				var a = this.getOwnerTree();
				return a ? a.getSelectionModel().isSelected(this) : false
			},
			expand : function (a, c, d, b) {
				if (!this.expanded) {
					if (this.fireEvent("beforeexpand", this, a, c) === false) {
						return
					}
					if (!this.childrenRendered) {
						this.renderChildren()
					}
					this.expanded = true;
					if (!this.isHiddenRoot() && (this.getOwnerTree().animate && c !== false) || c) {
						this.ui.animExpand(function () {
								this.fireEvent("expand", this);
								this.runCallback(d, b || this, [this]);
								if (a === true) {
									this.expandChildNodes(true, true)
								}
							}
							.createDelegate(this));
						return
					} else {
						this.ui.expand();
						this.fireEvent("expand", this);
						this.runCallback(d, b || this, [this])
					}
				} else {
					this.runCallback(d, b || this, [this])
				}
				if (a === true) {
					this.expandChildNodes(true)
				}
			},
			runCallback : function (a, c, b) {
				if (Ext.isFunction(a)) {
					a.apply(c, b)
				}
			},
			isHiddenRoot : function () {
				return this.isRoot && !this.getOwnerTree().rootVisible
			},
			collapse : function (b, g, h, e) {
				if (this.expanded && !this.isHiddenRoot()) {
					if (this.fireEvent("beforecollapse", this, b, g) === false) {
						return
					}
					this.expanded = false;
					if ((this.getOwnerTree().animate && g !== false) || g) {
						this.ui.animCollapse(function () {
								this.fireEvent("collapse", this);
								this.runCallback(h, e || this, [this]);
								if (b === true) {
									this.collapseChildNodes(true)
								}
							}
							.createDelegate(this));
						return
					} else {
						this.ui.collapse();
						this.fireEvent("collapse", this);
						this.runCallback(h, e || this, [this])
					}
				} else {
					if (!this.expanded) {
						this.runCallback(h, e || this, [this])
					}
				}
				if (b === true) {
					var d = this.childNodes;
					for (var c = 0, a = d.length; c < a; c++) {
						d[c].collapse(true, false)
					}
				}
			},
			delayedExpand : function (a) {
				if (!this.expandProcId) {
					this.expandProcId = this.expand.defer(a, this)
				}
			},
			cancelExpand : function () {
				if (this.expandProcId) {
					clearTimeout(this.expandProcId)
				}
				this.expandProcId = false
			},
			toggle : function () {
				if (this.expanded) {
					this.collapse()
				} else {
					this.expand()
				}
			},
			ensureVisible : function (c, b) {
				var a = this.getOwnerTree();
				a.expandPath(this.parentNode ? this.parentNode.getPath() : this.getPath(), false, function () {
						var d = a.getNodeById(this.id);
						a.getTreeEl().scrollChildIntoView(d.ui.anchor);
						this.runCallback(c, b || this, [this])
					}
					.createDelegate(this))
			},
			expandChildNodes : function (b, e) {
				var d = this.childNodes,
				c,
				a = d.length;
				for (c = 0; c < a; c++) {
					d[c].expand(b, e)
				}
			},
			collapseChildNodes : function (b) {
				var d = this.childNodes;
				for (var c = 0, a = d.length; c < a; c++) {
					d[c].collapse(b)
				}
			},
			disable : function () {
				this.disabled = true;
				this.unselect();
				if (this.rendered && this.ui.onDisableChange) {
					this.ui.onDisableChange(this, true)
				}
				this.fireEvent("disabledchange", this, true)
			},
			enable : function () {
				this.disabled = false;
				if (this.rendered && this.ui.onDisableChange) {
					this.ui.onDisableChange(this, false)
				}
				this.fireEvent("disabledchange", this, false)
			},
			renderChildren : function (b) {
				if (b !== false) {
					this.fireEvent("beforechildrenrendered", this)
				}
				var d = this.childNodes;
				for (var c = 0, a = d.length; c < a; c++) {
					d[c].render(true)
				}
				this.childrenRendered = true
			},
			sort : function (e, d) {
				Ext.tree.TreeNode.superclass.sort.apply(this, arguments);
				if (this.childrenRendered) {
					var c = this.childNodes;
					for (var b = 0, a = c.length; b < a; b++) {
						c[b].render(true)
					}
				}
			},
			render : function (a) {
				this.ui.render(a);
				if (!this.rendered) {
					this.getOwnerTree().registerNode(this);
					this.rendered = true;
					if (this.expanded) {
						this.expanded = false;
						this.expand(false, false)
					}
				}
			},
			renderIndent : function (b, e) {
				if (e) {
					this.ui.childIndent = null
				}
				this.ui.renderIndent();
				if (b === true && this.childrenRendered) {
					var d = this.childNodes;
					for (var c = 0, a = d.length; c < a; c++) {
						d[c].renderIndent(true, e)
					}
				}
			},
			beginUpdate : function () {
				this.childrenRendered = false
			},
			endUpdate : function () {
				if (this.expanded && this.rendered) {
					this.renderChildren()
				}
			},
			destroy : function (a) {
				if (a === true) {
					this.unselect(true)
				}
				Ext.tree.TreeNode.superclass.destroy.call(this, a);
				Ext.destroy(this.ui, this.loader);
				this.ui = this.loader = null
			},
			onIdChange : function (a) {
				this.ui.onIdChange(a)
			}
		});
Ext.tree.TreePanel.nodeTypes.node = Ext.tree.TreeNode;
Ext.tree.AsyncTreeNode = function (a) {
	this.loaded = a && a.loaded === true;
	this.loading = false;
	Ext.tree.AsyncTreeNode.superclass.constructor.apply(this, arguments);
	this.addEvents("beforeload", "load")
};
Ext.extend(Ext.tree.AsyncTreeNode, Ext.tree.TreeNode, {
		expand : function (b, e, h, c) {
			if (this.loading) {
				var g;
				var d = function () {
					if (!this.loading) {
						clearInterval(g);
						this.expand(b, e, h, c)
					}
				}
				.createDelegate(this);
				g = setInterval(d, 200);
				return
			}
			if (!this.loaded) {
				if (this.fireEvent("beforeload", this) === false) {
					return
				}
				this.loading = true;
				this.ui.beforeLoad(this);
				var a = this.loader || this.attributes.loader || this.getOwnerTree().getLoader();
				if (a) {
					a.load(this, this.loadComplete.createDelegate(this, [b, e, h, c]), this);
					return
				}
			}
			Ext.tree.AsyncTreeNode.superclass.expand.call(this, b, e, h, c)
		},
		isLoading : function () {
			return this.loading
		},
		loadComplete : function (a, c, d, b) {
			this.loading = false;
			this.loaded = true;
			this.ui.afterLoad(this);
			this.fireEvent("load", this);
			this.expand(a, c, d, b)
		},
		isLoaded : function () {
			return this.loaded
		},
		hasChildNodes : function () {
			if (!this.isLeaf() && !this.loaded) {
				return true
			} else {
				return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this)
			}
		},
		reload : function (b, a) {
			this.collapse(false, false);
			while (this.firstChild) {
				this.removeChild(this.firstChild).destroy()
			}
			this.childrenRendered = false;
			this.loaded = false;
			if (this.isHiddenRoot()) {
				this.expanded = false
			}
			this.expand(false, false, b, a)
		}
	});
Ext.tree.TreePanel.nodeTypes.async = Ext.tree.AsyncTreeNode;
Ext.tree.TreeNodeUI = Ext.extend(Object, {
			constructor : function (a) {
				Ext.apply(this, {
						node : a,
						rendered : false,
						animating : false,
						wasLeaf : true,
						ecc : "x-tree-ec-icon x-tree-elbow",
						emptyIcon : Ext.BLANK_IMAGE_URL
					})
			},
			removeChild : function (a) {
				if (this.rendered) {
					this.ctNode.removeChild(a.ui.getEl())
				}
			},
			beforeLoad : function () {
				this.addClass("x-tree-node-loading")
			},
			afterLoad : function () {
				this.removeClass("x-tree-node-loading")
			},
			onTextChange : function (b, c, a) {
				if (this.rendered) {
					this.textNode.innerHTML = c
				}
			},
			onIconClsChange : function (c, a, b) {
				if (this.rendered) {
					Ext.fly(this.iconNode).replaceClass(b, a)
				}
			},
			onIconChange : function (b, a) {
				if (this.rendered) {
					var c = Ext.isEmpty(a);
					this.iconNode.src = c ? this.emptyIcon : a;
					Ext.fly(this.iconNode)[c ? "removeClass" : "addClass"]("x-tree-node-inline-icon")
				}
			},
			onTipChange : function (b, c, d) {
				if (this.rendered) {
					var a = Ext.isDefined(d);
					if (this.textNode.setAttributeNS) {
						this.textNode.setAttributeNS("ext", "qtip", c);
						if (a) {
							this.textNode.setAttributeNS("ext", "qtitle", d)
						}
					} else {
						this.textNode.setAttribute("ext:qtip", c);
						if (a) {
							this.textNode.setAttribute("ext:qtitle", d)
						}
					}
				}
			},
			onHrefChange : function (b, a, c) {
				if (this.rendered) {
					this.anchor.href = this.getHref(a);
					if (Ext.isDefined(c)) {
						this.anchor.target = c
					}
				}
			},
			onClsChange : function (c, a, b) {
				if (this.rendered) {
					Ext.fly(this.elNode).replaceClass(b, a)
				}
			},
			onDisableChange : function (a, b) {
				this.disabled = b;
				if (this.checkbox) {
					this.checkbox.disabled = b
				}
				this[b ? "addClass" : "removeClass"]("x-tree-node-disabled")
			},
			onSelectedChange : function (a) {
				if (a) {
					this.focus();
					this.addClass("x-tree-selected")
				} else {
					this.removeClass("x-tree-selected")
				}
			},
			onMove : function (a, h, e, g, d, b) {
				this.childIndent = null;
				if (this.rendered) {
					var i = g.ui.getContainer();
					if (!i) {
						this.holder = document.createElement("div");
						this.holder.appendChild(this.wrap);
						return
					}
					var c = b ? b.ui.getEl() : null;
					if (c) {
						i.insertBefore(this.wrap, c)
					} else {
						i.appendChild(this.wrap)
					}
					this.node.renderIndent(true, e != g)
				}
			},
			addClass : function (a) {
				if (this.elNode) {
					Ext.fly(this.elNode).addClass(a)
				}
			},
			removeClass : function (a) {
				if (this.elNode) {
					Ext.fly(this.elNode).removeClass(a)
				}
			},
			remove : function () {
				if (this.rendered) {
					this.holder = document.createElement("div");
					this.holder.appendChild(this.wrap)
				}
			},
			fireEvent : function () {
				return this.node.fireEvent.apply(this.node, arguments)
			},
			initEvents : function () {
				this.node.on("move", this.onMove, this);
				if (this.node.disabled) {
					this.onDisableChange(this.node, true)
				}
				if (this.node.hidden) {
					this.hide()
				}
				var b = this.node.getOwnerTree();
				var a = b.enableDD || b.enableDrag || b.enableDrop;
				if (a && (!this.node.isRoot || b.rootVisible)) {
					Ext.dd.Registry.register(this.elNode, {
							node : this.node,
							handles : this.getDDHandles(),
							isHandle : false
						})
				}
			},
			getDDHandles : function () {
				return [this.iconNode, this.textNode, this.elNode]
			},
			hide : function () {
				this.node.hidden = true;
				if (this.wrap) {
					this.wrap.style.display = "none"
				}
			},
			show : function () {
				this.node.hidden = false;
				if (this.wrap) {
					this.wrap.style.display = ""
				}
			},
			onContextMenu : function (a) {
				if (this.node.hasListener("contextmenu") || this.node.getOwnerTree().hasListener("contextmenu")) {
					a.preventDefault();
					this.focus();
					this.fireEvent("contextmenu", this.node, a)
				}
			},
			onClick : function (c) {
				if (this.dropping) {
					c.stopEvent();
					return
				}
				if (this.fireEvent("beforeclick", this.node, c) !== false) {
					var b = c.getTarget("a");
					if (!this.disabled && this.node.attributes.href && b) {
						this.fireEvent("click", this.node, c);
						return
					} else {
						if (b && c.ctrlKey) {
							c.stopEvent()
						}
					}
					c.preventDefault();
					if (this.disabled) {
						return
					}
					if (this.node.attributes.singleClickExpand && !this.animating && this.node.isExpandable()) {
						this.node.toggle()
					}
					this.fireEvent("click", this.node, c)
				} else {
					c.stopEvent()
				}
			},
			onDblClick : function (a) {
				a.preventDefault();
				if (this.disabled) {
					return
				}
				if (this.fireEvent("beforedblclick", this.node, a) !== false) {
					if (this.checkbox) {
						this.toggleCheck()
					}
					if (!this.animating && this.node.isExpandable()) {
						this.node.toggle()
					}
					this.fireEvent("dblclick", this.node, a)
				}
			},
			onOver : function (a) {
				this.addClass("x-tree-node-over")
			},
			onOut : function (a) {
				this.removeClass("x-tree-node-over")
			},
			onCheckChange : function () {
				var a = this.checkbox.checked;
				this.checkbox.defaultChecked = a;
				this.node.attributes.checked = a;
				this.fireEvent("checkchange", this.node, a)
			},
			ecClick : function (a) {
				if (!this.animating && this.node.isExpandable()) {
					this.node.toggle()
				}
			},
			startDrop : function () {
				this.dropping = true
			},
			endDrop : function () {
				setTimeout(function () {
						this.dropping = false
					}
					.createDelegate(this), 50)
			},
			expand : function () {
				this.updateExpandIcon();
				this.ctNode.style.display = ""
			},
			focus : function () {
				if (!this.node.preventHScroll) {
					try {
						this.anchor.focus()
					} catch (c) {}
					
				} else {
					try {
						var b = this.node.getOwnerTree().getTreeEl().dom;
						var a = b.scrollLeft;
						this.anchor.focus();
						b.scrollLeft = a
					} catch (c) {}
					
				}
			},
			toggleCheck : function (b) {
				var a = this.checkbox;
				if (a) {
					a.checked = (b === undefined ? !a.checked : b);
					this.onCheckChange()
				}
			},
			blur : function () {
				try {
					this.anchor.blur()
				} catch (a) {}
				
			},
			animExpand : function (b) {
				var a = Ext.get(this.ctNode);
				a.stopFx();
				if (!this.node.isExpandable()) {
					this.updateExpandIcon();
					this.ctNode.style.display = "";
					Ext.callback(b);
					return
				}
				this.animating = true;
				this.updateExpandIcon();
				a.slideIn("t", {
						callback : function () {
							this.animating = false;
							Ext.callback(b)
						},
						scope : this,
						duration : this.node.ownerTree.duration || 0.25
					})
			},
			highlight : function () {
				var a = this.node.getOwnerTree();
				Ext.fly(this.wrap).highlight(a.hlColor || "C3DAF9", {
						endColor : a.hlBaseColor
					})
			},
			collapse : function () {
				this.updateExpandIcon();
				this.ctNode.style.display = "none"
			},
			animCollapse : function (b) {
				var a = Ext.get(this.ctNode);
				a.enableDisplayMode("block");
				a.stopFx();
				this.animating = true;
				this.updateExpandIcon();
				a.slideOut("t", {
						callback : function () {
							this.animating = false;
							Ext.callback(b)
						},
						scope : this,
						duration : this.node.ownerTree.duration || 0.25
					})
			},
			getContainer : function () {
				return this.ctNode
			},
			getEl : function () {
				return this.wrap
			},
			appendDDGhost : function (a) {
				a.appendChild(this.elNode.cloneNode(true))
			},
			getDDRepairXY : function () {
				return Ext.lib.Dom.getXY(this.iconNode)
			},
			onRender : function () {
				this.render()
			},
			render : function (c) {
				var e = this.node,
				b = e.attributes;
				var d = e.parentNode ? e.parentNode.ui.getContainer() : e.ownerTree.innerCt.dom;
				if (!this.rendered) {
					this.rendered = true;
					this.renderElements(e, b, d, c);
					if (b.qtip) {
						this.onTipChange(e, b.qtip, b.qtipTitle)
					} else {
						if (b.qtipCfg) {
							b.qtipCfg.target = Ext.id(this.textNode);
							Ext.QuickTips.register(b.qtipCfg)
						}
					}
					this.initEvents();
					if (!this.node.expanded) {
						this.updateExpandIcon(true)
					}
				} else {
					if (c === true) {
						d.appendChild(this.wrap)
					}
				}
			},
			renderElements : function (e, k, j, l) {
				this.indentMarkup = e.parentNode ? e.parentNode.ui.getChildIndent() : "";
				var g = Ext.isBoolean(k.checked),
				b,
				c = this.getHref(k.href),
				d = ['<li class="x-tree-node"><div ext:tree-node-id="', e.id, '" class="x-tree-node-el x-tree-node-leaf x-unselectable ', k.cls, '" unselectable="on">', '<span class="x-tree-node-indent">', this.indentMarkup, "</span>", '<img alt="" src="', this.emptyIcon, '" class="x-tree-ec-icon x-tree-elbow" />', '<img alt="" src="', k.icon || this.emptyIcon, '" class="x-tree-node-icon', (k.icon ? " x-tree-node-inline-icon" : ""), (k.iconCls ? " " + k.iconCls : ""), '" unselectable="on" />', g ? ('<input class="x-tree-node-cb" type="checkbox" ' + (k.checked ? 'checked="checked" />' : "/>")) : "", '<a hidefocus="on" class="x-tree-node-anchor" href="', c, '" tabIndex="1" ', k.hrefTarget ? ' target="' + k.hrefTarget + '"' : "", '><span unselectable="on">', e.text, "</span></a></div>", '<ul class="x-tree-node-ct" style="display:none;"></ul>', "</li>"].join("");
				if (l !== true && e.nextSibling && (b = e.nextSibling.ui.getEl())) {
					this.wrap = Ext.DomHelper.insertHtml("beforeBegin", b, d)
				} else {
					this.wrap = Ext.DomHelper.insertHtml("beforeEnd", j, d)
				}
				this.elNode = this.wrap.childNodes[0];
				this.ctNode = this.wrap.childNodes[1];
				var i = this.elNode.childNodes;
				this.indentNode = i[0];
				this.ecNode = i[1];
				this.iconNode = i[2];
				var h = 3;
				if (g) {
					this.checkbox = i[3];
					this.checkbox.defaultChecked = this.checkbox.checked;
					h++
				}
				this.anchor = i[h];
				this.textNode = i[h].firstChild
			},
			getHref : function (a) {
				return Ext.isEmpty(a) ? (Ext.isGecko ? "" : "#") : a
			},
			getAnchor : function () {
				return this.anchor
			},
			getTextEl : function () {
				return this.textNode
			},
			getIconEl : function () {
				return this.iconNode
			},
			isChecked : function () {
				return this.checkbox ? this.checkbox.checked : false
			},
			updateExpandIcon : function () {
				if (this.rendered) {
					var g = this.node,
					d,
					c,
					a = g.isLast() ? "x-tree-elbow-end" : "x-tree-elbow",
					e = g.hasChildNodes();
					if (e || g.attributes.expandable) {
						if (g.expanded) {
							a += "-minus";
							d = "x-tree-node-collapsed";
							c = "x-tree-node-expanded"
						} else {
							a += "-plus";
							d = "x-tree-node-expanded";
							c = "x-tree-node-collapsed"
						}
						if (this.wasLeaf) {
							this.removeClass("x-tree-node-leaf");
							this.wasLeaf = false
						}
						if (this.c1 != d || this.c2 != c) {
							Ext.fly(this.elNode).replaceClass(d, c);
							this.c1 = d;
							this.c2 = c
						}
					} else {
						if (!this.wasLeaf) {
							Ext.fly(this.elNode).replaceClass("x-tree-node-expanded", "x-tree-node-collapsed");
							delete this.c1;
							delete this.c2;
							this.wasLeaf = true
						}
					}
					var b = "x-tree-ec-icon " + a;
					if (this.ecc != b) {
						this.ecNode.className = b;
						this.ecc = b
					}
				}
			},
			onIdChange : function (a) {
				if (this.rendered) {
					this.elNode.setAttribute("ext:tree-node-id", a)
				}
			},
			getChildIndent : function () {
				if (!this.childIndent) {
					var a = [],
					b = this.node;
					while (b) {
						if (!b.isRoot || (b.isRoot && b.ownerTree.rootVisible)) {
							if (!b.isLast()) {
								a.unshift('<img alt="" src="' + this.emptyIcon + '" class="x-tree-elbow-line" />')
							} else {
								a.unshift('<img alt="" src="' + this.emptyIcon + '" class="x-tree-icon" />')
							}
						}
						b = b.parentNode
					}
					this.childIndent = a.join("")
				}
				return this.childIndent
			},
			renderIndent : function () {
				if (this.rendered) {
					var a = "",
					b = this.node.parentNode;
					if (b) {
						a = b.ui.getChildIndent()
					}
					if (this.indentMarkup != a) {
						this.indentNode.innerHTML = a;
						this.indentMarkup = a
					}
					this.updateExpandIcon()
				}
			},
			destroy : function () {
				if (this.elNode) {
					Ext.dd.Registry.unregister(this.elNode.id)
				}
				Ext.each(["textnode", "anchor", "checkbox", "indentNode", "ecNode", "iconNode", "elNode", "ctNode", "wrap", "holder"], function (a) {
						if (this[a]) {
							Ext.fly(this[a]).remove();
							delete this[a]
						}
					}, this);
				delete this.node
			}
		});
Ext.tree.RootTreeNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {
			render : function () {
				if (!this.rendered) {
					var a = this.node.ownerTree.innerCt.dom;
					this.node.expanded = true;
					a.innerHTML = '<div class="x-tree-root-node"></div>';
					this.wrap = this.ctNode = a.firstChild
				}
			},
			collapse : Ext.emptyFn,
			expand : Ext.emptyFn
		});
Ext.tree.TreeLoader = function (a) {
	this.baseParams = {};
	Ext.apply(this, a);
	this.addEvents("beforeload", "load", "loadexception");
	Ext.tree.TreeLoader.superclass.constructor.call(this);
	if (Ext.isString(this.paramOrder)) {
		this.paramOrder = this.paramOrder.split(/[\s,|]/)
	}
};
Ext.extend(Ext.tree.TreeLoader, Ext.util.Observable, {
		uiProviders : {},
		clearOnLoad : true,
		paramOrder : undefined,
		paramsAsHash : false,
		nodeParameter : "node",
		directFn : undefined,
		load : function (b, c, a) {
			if (this.clearOnLoad) {
				while (b.firstChild) {
					b.removeChild(b.firstChild)
				}
			}
			if (this.doPreload(b)) {
				this.runCallback(c, a || b, [b])
			} else {
				if (this.directFn || this.dataUrl || this.url) {
					this.requestData(b, c, a || b)
				}
			}
		},
		doPreload : function (d) {
			if (d.attributes.children) {
				if (d.childNodes.length < 1) {
					var c = d.attributes.children;
					d.beginUpdate();
					for (var b = 0, a = c.length; b < a; b++) {
						var e = d.appendChild(this.createNode(c[b]));
						if (this.preloadChildren) {
							this.doPreload(e)
						}
					}
					d.endUpdate()
				}
				return true
			}
			return false
		},
		getParams : function (g) {
			var e = Ext.apply({}, this.baseParams),
			h = this.nodeParameter,
			b = this.paramOrder;
			h && (e[h] = g.id);
			if (this.directFn) {
				var c = [g.id];
				if (b) {
					if (h && b.indexOf(h) > -1) {
						c = []
					}
					for (var d = 0, a = b.length; d < a; d++) {
						c.push(e[b[d]])
					}
				} else {
					if (this.paramsAsHash) {
						c = [e]
					}
				}
				return c
			} else {
				return e
			}
		},
		requestData : function (c, d, b) {
			if (this.fireEvent("beforeload", this, c, d) !== false) {
				if (this.directFn) {
					var a = this.getParams(c);
					a.push(this.processDirectResponse.createDelegate(this, [{
									callback : d,
									node : c,
									scope : b
								}
							], true));
					this.directFn.apply(window, a)
				} else {
					this.transId = Ext.Ajax.request({
								method : this.requestMethod,
								url : this.dataUrl || this.url,
								success : this.handleResponse,
								failure : this.handleFailure,
								scope : this,
								argument : {
									callback : d,
									node : c,
									scope : b
								},
								params : this.getParams(c)
							})
				}
			} else {
				this.runCallback(d, b || c, [])
			}
		},
		processDirectResponse : function (a, b, c) {
			if (b.status) {
				this.handleResponse({
						responseData : Ext.isArray(a) ? a : null,
						responseText : a,
						argument : c
					})
			} else {
				this.handleFailure({
						argument : c
					})
			}
		},
		runCallback : function (a, c, b) {
			if (Ext.isFunction(a)) {
				a.apply(c, b)
			}
		},
		isLoading : function () {
			return !!this.transId
		},
		abort : function () {
			if (this.isLoading()) {
				Ext.Ajax.abort(this.transId)
			}
		},
		createNode : function (attr) {
			if (this.baseAttrs) {
				Ext.applyIf(attr, this.baseAttrs)
			}
			if (this.applyLoader !== false && !attr.loader) {
				attr.loader = this
			}
			if (Ext.isString(attr.uiProvider)) {
				attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider)
			}
			if (attr.nodeType) {
				return new Ext.tree.TreePanel.nodeTypes[attr.nodeType](attr)
			} else {
				return attr.leaf ? new Ext.tree.TreeNode(attr) : new Ext.tree.AsyncTreeNode(attr)
			}
		},
		processResponse : function (d, c, k, l) {
			var m = d.responseText;
			try {
				var a = d.responseData || Ext.decode(m);
				c.beginUpdate();
				for (var g = 0, h = a.length; g < h; g++) {
					var b = this.createNode(a[g]);
					if (b) {
						c.appendChild(b)
					}
				}
				c.endUpdate();
				this.runCallback(k, l || c, [c])
			} catch (j) {
				this.handleFailure(d)
			}
		},
		handleResponse : function (c) {
			this.transId = false;
			var b = c.argument;
			this.processResponse(c, b.node, b.callback, b.scope);
			this.fireEvent("load", this, b.node, c)
		},
		handleFailure : function (c) {
			this.transId = false;
			var b = c.argument;
			this.fireEvent("loadexception", this, b.node, c);
			this.runCallback(b.callback, b.scope || b.node, [b.node])
		},
		destroy : function () {
			this.abort();
			this.purgeListeners()
		}
	});
Ext.tree.TreeFilter = function (a, b) {
	this.tree = a;
	this.filtered = {};
	Ext.apply(this, b)
};
Ext.tree.TreeFilter.prototype = {
	clearBlank : false,
	reverse : false,
	autoClear : false,
	remove : false,
	filter : function (d, a, b) {
		a = a || "text";
		var c;
		if (typeof d == "string") {
			var e = d.length;
			if (e == 0 && this.clearBlank) {
				this.clear();
				return
			}
			d = d.toLowerCase();
			c = function (g) {
				return g.attributes[a].substr(0, e).toLowerCase() == d
			}
		} else {
			if (d.exec) {
				c = function (g) {
					return d.test(g.attributes[a])
				}
			} else {
				throw "Illegal filter type, must be string or regex"
			}
		}
		this.filterBy(c, null, b)
	},
	filterBy : function (d, c, b) {
		b = b || this.tree.root;
		if (this.autoClear) {
			this.clear()
		}
		var a = this.filtered,
		i = this.reverse;
		var e = function (k) {
			if (k == b) {
				return true
			}
			if (a[k.id]) {
				return false
			}
			var j = d.call(c || k, k);
			if (!j || i) {
				a[k.id] = k;
				k.ui.hide();
				return false
			}
			return true
		};
		b.cascade(e);
		if (this.remove) {
			for (var h in a) {
				if (typeof h != "function") {
					var g = a[h];
					if (g && g.parentNode) {
						g.parentNode.removeChild(g)
					}
				}
			}
		}
	},
	clear : function () {
		var b = this.tree;
		var a = this.filtered;
		for (var d in a) {
			if (typeof d != "function") {
				var c = a[d];
				if (c) {
					c.ui.show()
				}
			}
		}
		this.filtered = {}
		
	}
};
Ext.tree.TreeSorter = Ext.extend(Object, {
			constructor : function (a, c) {
				Ext.apply(this, c);
				a.on({
						scope : this,
						beforechildrenrendered : this.doSort,
						append : this.updateSort,
						insert : this.updateSort,
						textchange : this.updateSortParent
					});
				var e = this.dir && this.dir.toLowerCase() == "desc",
				i = this.property || "text",
				d = this.sortType,
				h = this.folderSort,
				b = this.caseSensitive === true,
				g = this.leafAttr || "leaf";
				if (Ext.isString(d)) {
					d = Ext.data.SortTypes[d]
				}
				this.sortFn = function (o, m) {
					var k = o.attributes,
					j = m.attributes;
					if (h) {
						if (k[g] && !j[g]) {
							return 1
						}
						if (!k[g] && j[g]) {
							return -1
						}
					}
					var n = k[i],
					l = j[i],
					q = d ? d(n) : (b ? n : n.toUpperCase()),
					p = d ? d(l) : (b ? l : l.toUpperCase());
					if (q < p) {
						return e ? 1 : -1
					} else {
						if (q > p) {
							return e ? -1 : 1
						}
					}
					return 0
				}
			},
			doSort : function (a) {
				a.sort(this.sortFn)
			},
			updateSort : function (a, b) {
				if (b.childrenRendered) {
					this.doSort.defer(1, this, [b])
				}
			},
			updateSortParent : function (a) {
				var b = a.parentNode;
				if (b && b.childrenRendered) {
					this.doSort.defer(1, this, [b])
				}
			}
		});
if (Ext.dd.DropZone) {
	Ext.tree.TreeDropZone = function (a, b) {
		this.allowParentInsert = b.allowParentInsert || false;
		this.allowContainerDrop = b.allowContainerDrop || false;
		this.appendOnly = b.appendOnly || false;
		Ext.tree.TreeDropZone.superclass.constructor.call(this, a.getTreeEl(), b);
		this.tree = a;
		this.dragOverData = {};
		this.lastInsertClass = "x-tree-no-status"
	};
	Ext.extend(Ext.tree.TreeDropZone, Ext.dd.DropZone, {
			ddGroup : "TreeDD",
			expandDelay : 1000,
			expandNode : function (a) {
				if (a.hasChildNodes() && !a.isExpanded()) {
					a.expand(false, null, this.triggerCacheRefresh.createDelegate(this))
				}
			},
			queueExpand : function (a) {
				this.expandProcId = this.expandNode.defer(this.expandDelay, this, [a])
			},
			cancelExpand : function () {
				if (this.expandProcId) {
					clearTimeout(this.expandProcId);
					this.expandProcId = false
				}
			},
			isValidDropPoint : function (a, k, i, d, c) {
				if (!a || !c) {
					return false
				}
				var g = a.node;
				var h = c.node;
				if (!(g && g.isTarget && k)) {
					return false
				}
				if (k == "append" && g.allowChildren === false) {
					return false
				}
				if ((k == "above" || k == "below") && (g.parentNode && g.parentNode.allowChildren === false)) {
					return false
				}
				if (h && (g == h || h.contains(g))) {
					return false
				}
				var b = this.dragOverData;
				b.tree = this.tree;
				b.target = g;
				b.data = c;
				b.point = k;
				b.source = i;
				b.rawEvent = d;
				b.dropNode = h;
				b.cancel = false;
				var j = this.tree.fireEvent("nodedragover", b);
				return b.cancel === false && j !== false
			},
			getDropPoint : function (h, g, l) {
				var m = g.node;
				if (m.isRoot) {
					return m.allowChildren !== false ? "append" : false
				}
				var c = g.ddel;
				var o = Ext.lib.Dom.getY(c),
				j = o + c.offsetHeight;
				var i = Ext.lib.Event.getPageY(h);
				var k = m.allowChildren === false || m.isLeaf();
				if (this.appendOnly || m.parentNode.allowChildren === false) {
					return k ? false : "append"
				}
				var d = false;
				if (!this.allowParentInsert) {
					d = m.hasChildNodes() && m.isExpanded()
				}
				var a = (j - o) / (k ? 2 : 3);
				if (i >= o && i < (o + a)) {
					return "above"
				} else {
					if (!d && (k || i >= j - a && i <= j)) {
						return "below"
					} else {
						return "append"
					}
				}
			},
			onNodeEnter : function (d, a, c, b) {
				this.cancelExpand()
			},
			onContainerOver : function (a, c, b) {
				if (this.allowContainerDrop && this.isValidDropPoint({
							ddel : this.tree.getRootNode().ui.elNode,
							node : this.tree.getRootNode()
						}, "append", a, c, b)) {
					return this.dropAllowed
				}
				return this.dropNotAllowed
			},
			onNodeOver : function (b, i, h, g) {
				var k = this.getDropPoint(h, b, i);
				var c = b.node;
				if (!this.expandProcId && k == "append" && c.hasChildNodes() && !b.node.isExpanded()) {
					this.queueExpand(c)
				} else {
					if (k != "append") {
						this.cancelExpand()
					}
				}
				var d = this.dropNotAllowed;
				if (this.isValidDropPoint(b, k, i, h, g)) {
					if (k) {
						var a = b.ddel;
						var j;
						if (k == "above") {
							d = b.node.isFirst() ? "x-tree-drop-ok-above" : "x-tree-drop-ok-between";
							j = "x-tree-drag-insert-above"
						} else {
							if (k == "below") {
								d = b.node.isLast() ? "x-tree-drop-ok-below" : "x-tree-drop-ok-between";
								j = "x-tree-drag-insert-below"
							} else {
								d = "x-tree-drop-ok-append";
								j = "x-tree-drag-append"
							}
						}
						if (this.lastInsertClass != j) {
							Ext.fly(a).replaceClass(this.lastInsertClass, j);
							this.lastInsertClass = j
						}
					}
				}
				return d
			},
			onNodeOut : function (d, a, c, b) {
				this.cancelExpand();
				this.removeDropIndicators(d)
			},
			onNodeDrop : function (i, b, h, d) {
				var a = this.getDropPoint(h, i, b);
				var g = i.node;
				g.ui.startDrop();
				if (!this.isValidDropPoint(i, a, b, h, d)) {
					g.ui.endDrop();
					return false
				}
				var c = d.node || (b.getTreeNode ? b.getTreeNode(d, g, a, h) : null);
				return this.processDrop(g, d, a, b, h, c)
			},
			onContainerDrop : function (a, g, c) {
				if (this.allowContainerDrop && this.isValidDropPoint({
							ddel : this.tree.getRootNode().ui.elNode,
							node : this.tree.getRootNode()
						}, "append", a, g, c)) {
					var d = this.tree.getRootNode();
					d.ui.startDrop();
					var b = c.node || (a.getTreeNode ? a.getTreeNode(c, d, "append", g) : null);
					return this.processDrop(d, c, "append", a, g, b)
				}
				return false
			},
			processDrop : function (j, h, b, a, i, d) {
				var g = {
					tree : this.tree,
					target : j,
					data : h,
					point : b,
					source : a,
					rawEvent : i,
					dropNode : d,
					cancel : !d,
					dropStatus : false
				};
				var c = this.tree.fireEvent("beforenodedrop", g);
				if (c === false || g.cancel === true || !g.dropNode) {
					j.ui.endDrop();
					return g.dropStatus
				}
				j = g.target;
				if (b == "append" && !j.isExpanded()) {
					j.expand(false, null, function () {
							this.completeDrop(g)
						}
						.createDelegate(this))
				} else {
					this.completeDrop(g)
				}
				return true
			},
			completeDrop : function (h) {
				var d = h.dropNode,
				e = h.point,
				c = h.target;
				if (!Ext.isArray(d)) {
					d = [d]
				}
				var g;
				for (var b = 0, a = d.length; b < a; b++) {
					g = d[b];
					if (e == "above") {
						c.parentNode.insertBefore(g, c)
					} else {
						if (e == "below") {
							c.parentNode.insertBefore(g, c.nextSibling)
						} else {
							c.appendChild(g)
						}
					}
				}
				g.ui.focus();
				if (Ext.enableFx && this.tree.hlDrop) {
					g.ui.highlight()
				}
				c.ui.endDrop();
				this.tree.fireEvent("nodedrop", h)
			},
			afterNodeMoved : function (a, c, g, d, b) {
				if (Ext.enableFx && this.tree.hlDrop) {
					b.ui.focus();
					b.ui.highlight()
				}
				this.tree.fireEvent("nodedrop", this.tree, d, c, a, g)
			},
			getTree : function () {
				return this.tree
			},
			removeDropIndicators : function (b) {
				if (b && b.ddel) {
					var a = b.ddel;
					Ext.fly(a).removeClass(["x-tree-drag-insert-above", "x-tree-drag-insert-below", "x-tree-drag-append"]);
					this.lastInsertClass = "_noclass"
				}
			},
			beforeDragDrop : function (b, a, c) {
				this.cancelExpand();
				return true
			},
			afterRepair : function (a) {
				if (a && Ext.enableFx) {
					a.node.ui.highlight()
				}
				this.hideProxy()
			}
		})
}
if (Ext.dd.DragZone) {
	Ext.tree.TreeDragZone = function (a, b) {
		Ext.tree.TreeDragZone.superclass.constructor.call(this, a.innerCt, b);
		this.tree = a
	};
	Ext.extend(Ext.tree.TreeDragZone, Ext.dd.DragZone, {
			ddGroup : "TreeDD",
			onBeforeDrag : function (a, b) {
				var c = a.node;
				return c && c.draggable && !c.disabled
			},
			onInitDrag : function (b) {
				var a = this.dragData;
				this.tree.getSelectionModel().select(a.node);
				this.tree.eventModel.disable();
				this.proxy.update("");
				a.node.ui.appendDDGhost(this.proxy.ghost.dom);
				this.tree.fireEvent("startdrag", this.tree, a.node, b)
			},
			getRepairXY : function (b, a) {
				return a.node.ui.getDDRepairXY()
			},
			onEndDrag : function (a, b) {
				this.tree.eventModel.enable.defer(100, this.tree.eventModel);
				this.tree.fireEvent("enddrag", this.tree, a.node, b)
			},
			onValidDrop : function (a, b, c) {
				this.tree.fireEvent("dragdrop", this.tree, this.dragData.node, a, b);
				this.hideProxy()
			},
			beforeInvalidDrop : function (a, c) {
				var b = this.tree.getSelectionModel();
				b.clearSelections();
				b.select(this.dragData.node)
			},
			afterRepair : function () {
				if (Ext.enableFx && this.tree.hlDrop) {
					Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9")
				}
				this.dragging = false
			}
		})
}
Ext.tree.TreeEditor = function (a, c, b) {
	c = c || {};
	var d = c.events ? c : new Ext.form.TextField(c);
	Ext.tree.TreeEditor.superclass.constructor.call(this, d, b);
	this.tree = a;
	if (!a.rendered) {
		a.on("render", this.initEditor, this)
	} else {
		this.initEditor(a)
	}
};
Ext.extend(Ext.tree.TreeEditor, Ext.Editor, {
		alignment : "l-l",
		autoSize : false,
		hideEl : false,
		cls : "x-small-editor x-tree-editor",
		shim : false,
		shadow : "frame",
		maxWidth : 250,
		editDelay : 350,
		initEditor : function (a) {
			a.on({
					scope : this,
					beforeclick : this.beforeNodeClick,
					dblclick : this.onNodeDblClick
				});
			this.on({
					scope : this,
					complete : this.updateNode,
					beforestartedit : this.fitToTree,
					specialkey : this.onSpecialKey
				});
			this.on("startedit", this.bindScroll, this, {
					delay : 10
				})
		},
		fitToTree : function (b, c) {
			var e = this.tree.getTreeEl().dom,
			d = c.dom;
			if (e.scrollLeft > d.offsetLeft) {
				e.scrollLeft = d.offsetLeft
			}
			var a = Math.min(this.maxWidth, (e.clientWidth > 20 ? e.clientWidth : e.offsetWidth) - Math.max(0, d.offsetLeft - e.scrollLeft) - 5);
			this.setSize(a, "")
		},
		triggerEdit : function (a, c) {
			this.completeEdit();
			if (a.attributes.editable !== false) {
				this.editNode = a;
				if (this.tree.autoScroll) {
					Ext.fly(a.ui.getEl()).scrollIntoView(this.tree.body)
				}
				var b = a.text || "";
				if (!Ext.isGecko && Ext.isEmpty(a.text)) {
					a.setText("&#160;")
				}
				this.autoEditTimer = this.startEdit.defer(this.editDelay, this, [a.ui.textNode, b]);
				return false
			}
		},
		bindScroll : function () {
			this.tree.getTreeEl().on("scroll", this.cancelEdit, this)
		},
		beforeNodeClick : function (a, b) {
			clearTimeout(this.autoEditTimer);
			if (this.tree.getSelectionModel().isSelected(a)) {
				b.stopEvent();
				return this.triggerEdit(a)
			}
		},
		onNodeDblClick : function (a, b) {
			clearTimeout(this.autoEditTimer)
		},
		updateNode : function (a, b) {
			this.tree.getTreeEl().un("scroll", this.cancelEdit, this);
			this.editNode.setText(b)
		},
		onHide : function () {
			Ext.tree.TreeEditor.superclass.onHide.call(this);
			if (this.editNode) {
				this.editNode.ui.focus.defer(50, this.editNode.ui)
			}
		},
		onSpecialKey : function (c, b) {
			var a = b.getKey();
			if (a == b.ESC) {
				b.stopEvent();
				this.cancelEdit()
			} else {
				if (a == b.ENTER && !b.hasModifier()) {
					b.stopEvent();
					this.completeEdit()
				}
			}
		},
		onDestroy : function () {
			clearTimeout(this.autoEditTimer);
			Ext.tree.TreeEditor.superclass.onDestroy.call(this);
			var a = this.tree;
			a.un("beforeclick", this.beforeNodeClick, this);
			a.un("dblclick", this.onNodeDblClick, this)
		}
	});
/* SWFObject v2.2 <http://code.google.com/p/swfobject/>
is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
 */
var swfobject = function () {
	var E = "undefined",
	s = "object",
	T = "Shockwave Flash",
	X = "ShockwaveFlash.ShockwaveFlash",
	r = "application/x-shockwave-flash",
	S = "SWFObjectExprInst",
	y = "onreadystatechange",
	P = window,
	k = document,
	u = navigator,
	U = false,
	V = [i],
	p = [],
	O = [],
	J = [],
	m,
	R,
	F,
	C,
	K = false,
	a = false,
	o,
	H,
	n = true,
	N = function () {
		var ab = typeof k.getElementById != E && typeof k.getElementsByTagName != E && typeof k.createElement != E,
		ai = u.userAgent.toLowerCase(),
		Z = u.platform.toLowerCase(),
		af = Z ? (/win/).test(Z) : /win/.test(ai),
		ad = Z ? (/mac/).test(Z) : /mac/.test(ai),
		ag = /webkit/.test(ai) ? parseFloat(ai.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false,
		Y = ! + "\v1",
		ah = [0, 0, 0],
		ac = null;
		if (typeof u.plugins != E && typeof u.plugins[T] == s) {
			ac = u.plugins[T].description;
			if (ac && !(typeof u.mimeTypes != E && u.mimeTypes[r] && !u.mimeTypes[r].enabledPlugin)) {
				U = true;
				Y = false;
				ac = ac.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
				ah[0] = parseInt(ac.replace(/^(.*)\..*$/, "$1"), 10);
				ah[1] = parseInt(ac.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
				ah[2] = /[a-zA-Z]/.test(ac) ? parseInt(ac.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0
			}
		} else {
			if (typeof P.ActiveXObject != E) {
				try {
					var ae = new ActiveXObject(X);
					if (ae) {
						ac = ae.GetVariable("$version");
						if (ac) {
							Y = true;
							ac = ac.split(" ")[1].split(",");
							ah = [parseInt(ac[0], 10), parseInt(ac[1], 10), parseInt(ac[2], 10)]
						}
					}
				} catch (aa) {}
				
			}
		}
		return {
			w3 : ab,
			pv : ah,
			wk : ag,
			ie : Y,
			win : af,
			mac : ad
		}
	}
	(),
	l = function () {
		if (!N.w3) {
			return
		}
		if ((typeof k.readyState != E && k.readyState == "complete") || (typeof k.readyState == E && (k.getElementsByTagName("body")[0] || k.body))) {
			g()
		}
		if (!K) {
			if (typeof k.addEventListener != E) {
				k.addEventListener("DOMContentLoaded", g, false)
			}
			if (N.ie && N.win) {
				k.attachEvent(y, function () {
						if (k.readyState == "complete") {
							k.detachEvent(y, arguments.callee);
							g()
						}
					});
				if (P == top) {
					(function () {
							if (K) {
								return
							}
							try {
								k.documentElement.doScroll("left")
							} catch (Y) {
								setTimeout(arguments.callee, 0);
								return
							}
							g()
						})()
				}
			}
			if (N.wk) {
				(function () {
						if (K) {
							return
						}
						if (!(/loaded|complete/).test(k.readyState)) {
							setTimeout(arguments.callee, 0);
							return
						}
						g()
					})()
			}
			t(g)
		}
	}
	();
	function g() {
		if (K) {
			return
		}
		try {
			var aa = k.getElementsByTagName("body")[0].appendChild(D("span"));
			aa.parentNode.removeChild(aa)
		} catch (ab) {
			return
		}
		K = true;
		var Y = V.length;
		for (var Z = 0; Z < Y; Z++) {
			V[Z]()
		}
	}
	function L(Y) {
		if (K) {
			Y()
		} else {
			V[V.length] = Y
		}
	}
	function t(Z) {
		if (typeof P.addEventListener != E) {
			P.addEventListener("load", Z, false)
		} else {
			if (typeof k.addEventListener != E) {
				k.addEventListener("load", Z, false)
			} else {
				if (typeof P.attachEvent != E) {
					j(P, "onload", Z)
				} else {
					if (typeof P.onload == "function") {
						var Y = P.onload;
						P.onload = function () {
							Y();
							Z()
						}
					} else {
						P.onload = Z
					}
				}
			}
		}
	}
	function i() {
		if (U) {
			W()
		} else {
			I()
		}
	}
	function W() {
		var Y = k.getElementsByTagName("body")[0];
		var ab = D(s);
		ab.setAttribute("type", r);
		var aa = Y.appendChild(ab);
		if (aa) {
			var Z = 0;
			(function () {
					if (typeof aa.GetVariable != E) {
						var ac = aa.GetVariable("$version");
						if (ac) {
							ac = ac.split(" ")[1].split(",");
							N.pv = [parseInt(ac[0], 10), parseInt(ac[1], 10), parseInt(ac[2], 10)]
						}
					} else {
						if (Z < 10) {
							Z++;
							setTimeout(arguments.callee, 10);
							return
						}
					}
					Y.removeChild(ab);
					aa = null;
					I()
				})()
		} else {
			I()
		}
	}
	function I() {
		var ah = p.length;
		if (ah > 0) {
			for (var ag = 0; ag < ah; ag++) {
				var Z = p[ag].id;
				var ac = p[ag].callbackFn;
				var ab = {
					success : false,
					id : Z
				};
				if (N.pv[0] > 0) {
					var af = c(Z);
					if (af) {
						if (G(p[ag].swfVersion) && !(N.wk && N.wk < 312)) {
							x(Z, true);
							if (ac) {
								ab.success = true;
								ab.ref = A(Z);
								ac(ab)
							}
						} else {
							if (p[ag].expressInstall && B()) {
								var aj = {};
								aj.data = p[ag].expressInstall;
								aj.width = af.getAttribute("width") || "0";
								aj.height = af.getAttribute("height") || "0";
								if (af.getAttribute("class")) {
									aj.styleclass = af.getAttribute("class")
								}
								if (af.getAttribute("align")) {
									aj.align = af.getAttribute("align")
								}
								var ai = {};
								var Y = af.getElementsByTagName("param");
								var ad = Y.length;
								for (var ae = 0; ae < ad; ae++) {
									if (Y[ae].getAttribute("name").toLowerCase() != "movie") {
										ai[Y[ae].getAttribute("name")] = Y[ae].getAttribute("value")
									}
								}
								Q(aj, ai, Z, ac)
							} else {
								q(af);
								if (ac) {
									ac(ab)
								}
							}
						}
					}
				} else {
					x(Z, true);
					if (ac) {
						var aa = A(Z);
						if (aa && typeof aa.SetVariable != E) {
							ab.success = true;
							ab.ref = aa
						}
						ac(ab)
					}
				}
			}
		}
	}
	function A(ab) {
		var Y = null;
		var Z = c(ab);
		if (Z && Z.nodeName == "OBJECT") {
			if (typeof Z.SetVariable != E) {
				Y = Z
			} else {
				var aa = Z.getElementsByTagName(s)[0];
				if (aa) {
					Y = aa
				}
			}
		}
		return Y
	}
	function B() {
		return !a && G("6.0.65") && (N.win || N.mac) && !(N.wk && N.wk < 312)
	}
	function Q(ab, ac, Y, aa) {
		a = true;
		F = aa || null;
		C = {
			success : false,
			id : Y
		};
		var af = c(Y);
		if (af) {
			if (af.nodeName == "OBJECT") {
				m = h(af);
				R = null
			} else {
				m = af;
				R = Y
			}
			ab.id = S;
			if (typeof ab.width == E || (!(/%$/).test(ab.width) && parseInt(ab.width, 10) < 310)) {
				ab.width = "310"
			}
			if (typeof ab.height == E || (!(/%$/).test(ab.height) && parseInt(ab.height, 10) < 137)) {
				ab.height = "137"
			}
			k.title = k.title.slice(0, 47) + " - Flash Player Installation";
			var ae = N.ie && N.win ? "ActiveX" : "PlugIn",
			ad = "MMredirectURL=" + P.location.toString().replace(/&/g, "%26") + "&MMplayerType=" + ae + "&MMdoctitle=" + k.title;
			if (typeof ac.flashvars != E) {
				ac.flashvars += "&" + ad
			} else {
				ac.flashvars = ad
			}
			if (N.ie && N.win && af.readyState != 4) {
				var Z = D("div");
				Y += "SWFObjectNew";
				Z.setAttribute("id", Y);
				af.parentNode.insertBefore(Z, af);
				af.style.display = "none";
				(function () {
						if (af.readyState == 4) {
							af.parentNode.removeChild(af)
						} else {
							setTimeout(arguments.callee, 10)
						}
					})()
			}
			v(ab, ac, Y)
		}
	}
	function q(Z) {
		if (N.ie && N.win && Z.readyState != 4) {
			var Y = D("div");
			Z.parentNode.insertBefore(Y, Z);
			Y.parentNode.replaceChild(h(Z), Y);
			Z.style.display = "none";
			(function () {
					if (Z.readyState == 4) {
						Z.parentNode.removeChild(Z)
					} else {
						setTimeout(arguments.callee, 10)
					}
				})()
		} else {
			Z.parentNode.replaceChild(h(Z), Z)
		}
	}
	function h(ad) {
		var ab = D("div");
		if (N.win && N.ie) {
			ab.innerHTML = ad.innerHTML
		} else {
			var Z = ad.getElementsByTagName(s)[0];
			if (Z) {
				var ae = Z.childNodes;
				if (ae) {
					var Y = ae.length;
					for (var aa = 0; aa < Y; aa++) {
						if (!(ae[aa].nodeType == 1 && ae[aa].nodeName == "PARAM") && !(ae[aa].nodeType == 8)) {
							ab.appendChild(ae[aa].cloneNode(true))
						}
					}
				}
			}
		}
		return ab
	}
	function v(aj, ah, Z) {
		var Y,
		ab = c(Z);
		if (N.wk && N.wk < 312) {
			return Y
		}
		if (ab) {
			if (typeof aj.id == E) {
				aj.id = Z
			}
			if (N.ie && N.win) {
				var ai = "";
				for (var af in aj) {
					if (aj[af] != Object.prototype[af]) {
						if (af.toLowerCase() == "data") {
							ah.movie = aj[af]
						} else {
							if (af.toLowerCase() == "styleclass") {
								ai += ' class="' + aj[af] + '"'
							} else {
								if (af.toLowerCase() != "classid") {
									ai += " " + af + '="' + aj[af] + '"'
								}
							}
						}
					}
				}
				var ag = "";
				for (var ae in ah) {
					if (ah[ae] != Object.prototype[ae]) {
						ag += '<param name="' + ae + '" value="' + ah[ae] + '" />'
					}
				}
				ab.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + ai + ">" + ag + "</object>";
				O[O.length] = aj.id;
				Y = c(aj.id)
			} else {
				var aa = D(s);
				aa.setAttribute("type", r);
				for (var ad in aj) {
					if (aj[ad] != Object.prototype[ad]) {
						if (ad.toLowerCase() == "styleclass") {
							aa.setAttribute("class", aj[ad])
						} else {
							if (ad.toLowerCase() != "classid") {
								aa.setAttribute(ad, aj[ad])
							}
						}
					}
				}
				for (var ac in ah) {
					if (ah[ac] != Object.prototype[ac] && ac.toLowerCase() != "movie") {
						e(aa, ac, ah[ac])
					}
				}
				ab.parentNode.replaceChild(aa, ab);
				Y = aa
			}
		}
		return Y
	}
	function e(aa, Y, Z) {
		var ab = D("param");
		ab.setAttribute("name", Y);
		ab.setAttribute("value", Z);
		aa.appendChild(ab)
	}
	function z(Z) {
		var Y = c(Z);
		if (Y && Y.nodeName == "OBJECT") {
			if (N.ie && N.win) {
				Y.style.display = "none";
				(function () {
						if (Y.readyState == 4) {
							b(Z)
						} else {
							setTimeout(arguments.callee, 10)
						}
					})()
			} else {
				Y.parentNode.removeChild(Y)
			}
		}
	}
	function b(aa) {
		var Z = c(aa);
		if (Z) {
			for (var Y in Z) {
				if (typeof Z[Y] == "function") {
					Z[Y] = null
				}
			}
			Z.parentNode.removeChild(Z)
		}
	}
	function c(aa) {
		var Y = null;
		try {
			Y = k.getElementById(aa)
		} catch (Z) {}
		
		return Y
	}
	function D(Y) {
		return k.createElement(Y)
	}
	function j(aa, Y, Z) {
		aa.attachEvent(Y, Z);
		J[J.length] = [aa, Y, Z]
	}
	function G(aa) {
		var Z = N.pv,
		Y = aa.split(".");
		Y[0] = parseInt(Y[0], 10);
		Y[1] = parseInt(Y[1], 10) || 0;
		Y[2] = parseInt(Y[2], 10) || 0;
		return (Z[0] > Y[0] || (Z[0] == Y[0] && Z[1] > Y[1]) || (Z[0] == Y[0] && Z[1] == Y[1] && Z[2] >= Y[2])) ? true : false
	}
	function w(ad, Z, ae, ac) {
		if (N.ie && N.mac) {
			return
		}
		var ab = k.getElementsByTagName("head")[0];
		if (!ab) {
			return
		}
		var Y = (ae && typeof ae == "string") ? ae : "screen";
		if (ac) {
			o = null;
			H = null
		}
		if (!o || H != Y) {
			var aa = D("style");
			aa.setAttribute("type", "text/css");
			aa.setAttribute("media", Y);
			o = ab.appendChild(aa);
			if (N.ie && N.win && typeof k.styleSheets != E && k.styleSheets.length > 0) {
				o = k.styleSheets[k.styleSheets.length - 1]
			}
			H = Y
		}
		if (N.ie && N.win) {
			if (o && typeof o.addRule == s) {
				o.addRule(ad, Z)
			}
		} else {
			if (o && typeof k.createTextNode != E) {
				o.appendChild(k.createTextNode(ad + " {" + Z + "}"))
			}
		}
	}
	function x(aa, Y) {
		if (!n) {
			return
		}
		var Z = Y ? "visible" : "hidden";
		if (K && c(aa)) {
			c(aa).style.visibility = Z
		} else {
			w("#" + aa, "visibility:" + Z)
		}
	}
	function M(Z) {
		var aa = /[\\\"<>\.;]/;
		var Y = aa.exec(Z) != null;
		return Y && typeof encodeURIComponent != E ? encodeURIComponent(Z) : Z
	}
	var d = function () {
		if (N.ie && N.win) {
			window.attachEvent("onunload", function () {
					var ad = J.length;
					for (var ac = 0; ac < ad; ac++) {
						J[ac][0].detachEvent(J[ac][1], J[ac][2])
					}
					var aa = O.length;
					for (var ab = 0; ab < aa; ab++) {
						z(O[ab])
					}
					for (var Z in N) {
						N[Z] = null
					}
					N = null;
					for (var Y in swfobject) {
						swfobject[Y] = null
					}
					swfobject = null;
					window.detachEvent("onunload", arguments.callee)
				})
		}
	}
	();
	return {
		registerObject : function (ac, Y, ab, aa) {
			if (N.w3 && ac && Y) {
				var Z = {};
				Z.id = ac;
				Z.swfVersion = Y;
				Z.expressInstall = ab;
				Z.callbackFn = aa;
				p[p.length] = Z;
				x(ac, false)
			} else {
				if (aa) {
					aa({
							success : false,
							id : ac
						})
				}
			}
		},
		getObjectById : function (Y) {
			if (N.w3) {
				return A(Y)
			}
		},
		embedSWF : function (ac, ai, af, ah, Z, ab, aa, ae, ag, ad) {
			var Y = {
				success : false,
				id : ai
			};
			if (N.w3 && !(N.wk && N.wk < 312) && ac && ai && af && ah && Z) {
				x(ai, false);
				L(function () {
						af += "";
						ah += "";
						var ak = {};
						if (ag && typeof ag === s) {
							for (var am in ag) {
								ak[am] = ag[am]
							}
						}
						ak.data = ac;
						ak.width = af;
						ak.height = ah;
						var an = {};
						if (ae && typeof ae === s) {
							for (var al in ae) {
								an[al] = ae[al]
							}
						}
						if (aa && typeof aa === s) {
							for (var aj in aa) {
								if (typeof an.flashvars != E) {
									an.flashvars += "&" + aj + "=" + aa[aj]
								} else {
									an.flashvars = aj + "=" + aa[aj]
								}
							}
						}
						if (G(Z)) {
							var ao = v(ak, an, ai);
							if (ak.id == ai) {
								x(ai, true)
							}
							Y.success = true;
							Y.ref = ao
						} else {
							if (ab && B()) {
								ak.data = ab;
								Q(ak, an, ai, ad);
								return
							} else {
								x(ai, true)
							}
						}
						if (ad) {
							ad(Y)
						}
					})
			} else {
				if (ad) {
					ad(Y)
				}
			}
		},
		switchOffAutoHideShow : function () {
			n = false
		},
		ua : N,
		getFlashPlayerVersion : function () {
			return {
				major : N.pv[0],
				minor : N.pv[1],
				release : N.pv[2]
			}
		},
		hasFlashPlayerVersion : G,
		createSWF : function (aa, Z, Y) {
			if (N.w3) {
				return v(aa, Z, Y)
			} else {
				return undefined
			}
		},
		showExpressInstall : function (aa, ab, Y, Z) {
			if (N.w3 && B()) {
				Q(aa, ab, Y, Z)
			}
		},
		removeSWF : function (Y) {
			if (N.w3) {
				z(Y)
			}
		},
		createCSS : function (ab, aa, Z, Y) {
			if (N.w3) {
				w(ab, aa, Z, Y)
			}
		},
		addDomLoadEvent : L,
		addLoadEvent : t,
		getQueryParamValue : function (ab) {
			var aa = k.location.search || k.location.hash;
			if (aa) {
				if (/\?/.test(aa)) {
					aa = aa.split("?")[1]
				}
				if (ab == null) {
					return M(aa)
				}
				var Z = aa.split("&");
				for (var Y = 0; Y < Z.length; Y++) {
					if (Z[Y].substring(0, Z[Y].indexOf("=")) == ab) {
						return M(Z[Y].substring((Z[Y].indexOf("=") + 1)))
					}
				}
			}
			return ""
		},
		expressInstallCallback : function () {
			if (a) {
				var Y = c(S);
				if (Y && m) {
					Y.parentNode.replaceChild(m, Y);
					if (R) {
						x(R, true);
						if (N.ie && N.win) {
							m.style.display = "block"
						}
					}
					if (F) {
						F(C)
					}
				}
				a = false
			}
		}
	}
}
();
Ext.FlashComponent = Ext.extend(Ext.BoxComponent, {
			flashVersion : "9.0.115",
			backgroundColor : "#ffffff",
			wmode : "opaque",
			flashVars : undefined,
			flashParams : undefined,
			url : undefined,
			swfId : undefined,
			swfWidth : "100%",
			swfHeight : "100%",
			expressInstall : false,
			initComponent : function () {
				Ext.FlashComponent.superclass.initComponent.call(this);
				this.addEvents("initialize")
			},
			onRender : function () {
				Ext.FlashComponent.superclass.onRender.apply(this, arguments);
				var b = Ext.apply({
							allowScriptAccess : "always",
							bgcolor : this.backgroundColor,
							wmode : this.wmode
						}, this.flashParams),
				a = Ext.apply({
							allowedDomain : document.location.hostname,
							YUISwfId : this.getId(),
							YUIBridgeCallback : "Ext.FlashEventProxy.onEvent"
						}, this.flashVars);
				new swfobject.embedSWF(this.url, this.id, this.swfWidth, this.swfHeight, this.flashVersion, this.expressInstall ? Ext.FlashComponent.EXPRESS_INSTALL_URL : undefined, a, b);
				this.swf = Ext.getDom(this.id);
				this.el = Ext.get(this.swf)
			},
			getSwfId : function () {
				return this.swfId || (this.swfId = "extswf" + (++Ext.Component.AUTO_ID))
			},
			getId : function () {
				return this.id || (this.id = "extflashcmp" + (++Ext.Component.AUTO_ID))
			},
			onFlashEvent : function (a) {
				switch (a.type) {
				case "swfReady":
					this.initSwf();
					return;
				case "log":
					return
				}
				a.component = this;
				this.fireEvent(a.type.toLowerCase().replace(/event$/, ""), a)
			},
			initSwf : function () {
				this.onSwfReady(!!this.isInitialized);
				this.isInitialized = true;
				this.fireEvent("initialize", this)
			},
			beforeDestroy : function () {
				if (this.rendered) {
					swfobject.removeSWF(this.swf.id)
				}
				Ext.FlashComponent.superclass.beforeDestroy.call(this)
			},
			onSwfReady : Ext.emptyFn
		});
Ext.FlashComponent.EXPRESS_INSTALL_URL = "http://swfobject.googlecode.com/svn/trunk/swfobject/expressInstall.swf";
Ext.reg("flash", Ext.FlashComponent);
Ext.FlashEventProxy = {
	onEvent : function (c, b) {
		var a = Ext.getCmp(c);
		if (a) {
			a.onFlashEvent(b)
		} else {
			arguments.callee.defer(10, this, [c, b])
		}
	}
};
Ext.chart.Chart = Ext.extend(Ext.FlashComponent, {
			refreshBuffer : 100,
			chartStyle : {
				padding : 10,
				animationEnabled : true,
				font : {
					name : "Tahoma",
					color : 4473924,
					size : 11
				},
				dataTip : {
					padding : 5,
					border : {
						color : 10075112,
						size : 1
					},
					background : {
						color : 14346230,
						alpha : 0.9
					},
					font : {
						name : "Tahoma",
						color : 1393291,
						size : 10,
						bold : true
					}
				}
			},
			extraStyle : null,
			seriesStyles : null,
			disableCaching : Ext.isIE || Ext.isOpera,
			disableCacheParam : "_dc",
			initComponent : function () {
				Ext.chart.Chart.superclass.initComponent.call(this);
				if (!this.url) {
					this.url = Ext.chart.Chart.CHART_URL
				}
				if (this.disableCaching) {
					this.url = Ext.urlAppend(this.url, String.format("{0}={1}", this.disableCacheParam, new Date().getTime()))
				}
				this.addEvents("itemmouseover", "itemmouseout", "itemclick", "itemdoubleclick", "itemdragstart", "itemdrag", "itemdragend", "beforerefresh", "refresh");
				this.store = Ext.StoreMgr.lookup(this.store)
			},
			setStyle : function (a, b) {
				this.swf.setStyle(a, Ext.encode(b))
			},
			setStyles : function (a) {
				this.swf.setStyles(Ext.encode(a))
			},
			setSeriesStyles : function (b) {
				this.seriesStyles = b;
				var a = [];
				Ext.each(b, function (c) {
						a.push(Ext.encode(c))
					});
				this.swf.setSeriesStyles(a)
			},
			setCategoryNames : function (a) {
				this.swf.setCategoryNames(a)
			},
			setLegendRenderer : function (c, b) {
				var a = this;
				b = b || a;
				a.removeFnProxy(a.legendFnName);
				a.legendFnName = a.createFnProxy(function (d) {
							return c.call(b, d)
						});
				a.swf.setLegendLabelFunction(a.legendFnName)
			},
			setTipRenderer : function (c, b) {
				var a = this;
				b = b || a;
				a.removeFnProxy(a.tipFnName);
				a.tipFnName = a.createFnProxy(function (h, e, g) {
							var d = a.store.getAt(e);
							return c.call(b, a, d, e, g)
						});
				a.swf.setDataTipFunction(a.tipFnName)
			},
			setSeries : function (a) {
				this.series = a;
				this.refresh()
			},
			bindStore : function (a, b) {
				if (!b && this.store) {
					if (a !== this.store && this.store.autoDestroy) {
						this.store.destroy()
					} else {
						this.store.un("datachanged", this.refresh, this);
						this.store.un("add", this.delayRefresh, this);
						this.store.un("remove", this.delayRefresh, this);
						this.store.un("update", this.delayRefresh, this);
						this.store.un("clear", this.refresh, this)
					}
				}
				if (a) {
					a = Ext.StoreMgr.lookup(a);
					a.on({
							scope : this,
							datachanged : this.refresh,
							add : this.delayRefresh,
							remove : this.delayRefresh,
							update : this.delayRefresh,
							clear : this.refresh
						})
				}
				this.store = a;
				if (a && !b) {
					this.refresh()
				}
			},
			onSwfReady : function (b) {
				Ext.chart.Chart.superclass.onSwfReady.call(this, b);
				var a;
				this.swf.setType(this.type);
				if (this.chartStyle) {
					this.setStyles(Ext.apply({}, this.extraStyle, this.chartStyle))
				}
				if (this.categoryNames) {
					this.setCategoryNames(this.categoryNames)
				}
				if (this.tipRenderer) {
					a = this.getFunctionRef(this.tipRenderer);
					this.setTipRenderer(a.fn, a.scope)
				}
				if (this.legendRenderer) {
					a = this.getFunctionRef(this.legendRenderer);
					this.setLegendRenderer(a.fn, a.scope)
				}
				if (!b) {
					this.bindStore(this.store, true)
				}
				this.refresh.defer(10, this)
			},
			delayRefresh : function () {
				if (!this.refreshTask) {
					this.refreshTask = new Ext.util.DelayedTask(this.refresh, this)
				}
				this.refreshTask.delay(this.refreshBuffer)
			},
			refresh : function () {
				if (this.fireEvent("beforerefresh", this) !== false) {
					var m = false;
					var k = [],
					c = this.store.data.items;
					for (var g = 0, l = c.length; g < l; g++) {
						k[g] = c[g].data
					}
					var e = [];
					var d = 0;
					var n = null;
					var h = 0;
					if (this.series) {
						d = this.series.length;
						for (h = 0; h < d; h++) {
							n = this.series[h];
							var b = {};
							for (var a in n) {
								if (a == "style" && n.style !== null) {
									b.style = Ext.encode(n.style);
									m = true
								} else {
									b[a] = n[a]
								}
							}
							e.push(b)
						}
					}
					if (d > 0) {
						for (h = 0; h < d; h++) {
							n = e[h];
							if (!n.type) {
								n.type = this.type
							}
							n.dataProvider = k
						}
					} else {
						e.push({
								type : this.type,
								dataProvider : k
							})
					}
					this.swf.setDataProvider(e);
					if (this.seriesStyles) {
						this.setSeriesStyles(this.seriesStyles)
					}
					this.fireEvent("refresh", this)
				}
			},
			createFnProxy : function (a) {
				var b = "extFnProxy" + (++Ext.chart.Chart.PROXY_FN_ID);
				Ext.chart.Chart.proxyFunction[b] = a;
				return "Ext.chart.Chart.proxyFunction." + b
			},
			removeFnProxy : function (a) {
				if (!Ext.isEmpty(a)) {
					a = a.replace("Ext.chart.Chart.proxyFunction.", "");
					delete Ext.chart.Chart.proxyFunction[a]
				}
			},
			getFunctionRef : function (a) {
				if (Ext.isFunction(a)) {
					return {
						fn : a,
						scope : this
					}
				} else {
					return {
						fn : a.fn,
						scope : a.scope || this
					}
				}
			},
			onDestroy : function () {
				if (this.refreshTask && this.refreshTask.cancel) {
					this.refreshTask.cancel()
				}
				Ext.chart.Chart.superclass.onDestroy.call(this);
				this.bindStore(null);
				this.removeFnProxy(this.tipFnName);
				this.removeFnProxy(this.legendFnName)
			}
		});
Ext.reg("chart", Ext.chart.Chart);
Ext.chart.Chart.PROXY_FN_ID = 0;
Ext.chart.Chart.proxyFunction = {};
Ext.chart.Chart.CHART_URL = "http://yui.yahooapis.com/2.8.2/build/charts/assets/charts.swf";
Ext.chart.PieChart = Ext.extend(Ext.chart.Chart, {
			type : "pie",
			onSwfReady : function (a) {
				Ext.chart.PieChart.superclass.onSwfReady.call(this, a);
				this.setDataField(this.dataField);
				this.setCategoryField(this.categoryField)
			},
			setDataField : function (a) {
				this.dataField = a;
				this.swf.setDataField(a)
			},
			setCategoryField : function (a) {
				this.categoryField = a;
				this.swf.setCategoryField(a)
			}
		});
Ext.reg("piechart", Ext.chart.PieChart);
Ext.chart.CartesianChart = Ext.extend(Ext.chart.Chart, {
			onSwfReady : function (a) {
				Ext.chart.CartesianChart.superclass.onSwfReady.call(this, a);
				this.labelFn = [];
				if (this.xField) {
					this.setXField(this.xField)
				}
				if (this.yField) {
					this.setYField(this.yField)
				}
				if (this.xAxis) {
					this.setXAxis(this.xAxis)
				}
				if (this.xAxes) {
					this.setXAxes(this.xAxes)
				}
				if (this.yAxis) {
					this.setYAxis(this.yAxis)
				}
				if (this.yAxes) {
					this.setYAxes(this.yAxes)
				}
				if (Ext.isDefined(this.constrainViewport)) {
					this.swf.setConstrainViewport(this.constrainViewport)
				}
			},
			setXField : function (a) {
				this.xField = a;
				this.swf.setHorizontalField(a)
			},
			setYField : function (a) {
				this.yField = a;
				this.swf.setVerticalField(a)
			},
			setXAxis : function (a) {
				this.xAxis = this.createAxis("xAxis", a);
				this.swf.setHorizontalAxis(this.xAxis)
			},
			setXAxes : function (c) {
				var b;
				for (var a = 0; a < c.length; a++) {
					b = this.createAxis("xAxis" + a, c[a]);
					this.swf.setHorizontalAxis(b)
				}
			},
			setYAxis : function (a) {
				this.yAxis = this.createAxis("yAxis", a);
				this.swf.setVerticalAxis(this.yAxis)
			},
			setYAxes : function (c) {
				var b;
				for (var a = 0; a < c.length; a++) {
					b = this.createAxis("yAxis" + a, c[a]);
					this.swf.setVerticalAxis(b)
				}
			},
			createAxis : function (b, d) {
				var e = Ext.apply({}, d),
				c,
				a;
				if (this[b]) {
					a = this[b].labelFunction;
					this.removeFnProxy(a);
					this.labelFn.remove(a)
				}
				if (e.labelRenderer) {
					c = this.getFunctionRef(e.labelRenderer);
					e.labelFunction = this.createFnProxy(function (g) {
								return c.fn.call(c.scope, g)
							});
					delete e.labelRenderer;
					this.labelFn.push(e.labelFunction)
				}
				if (b.indexOf("xAxis") > -1 && e.position == "left") {
					e.position = "bottom"
				}
				return e
			},
			onDestroy : function () {
				Ext.chart.CartesianChart.superclass.onDestroy.call(this);
				Ext.each(this.labelFn, function (a) {
						this.removeFnProxy(a)
					}, this)
			}
		});
Ext.reg("cartesianchart", Ext.chart.CartesianChart);
Ext.chart.LineChart = Ext.extend(Ext.chart.CartesianChart, {
			type : "line"
		});
Ext.reg("linechart", Ext.chart.LineChart);
Ext.chart.ColumnChart = Ext.extend(Ext.chart.CartesianChart, {
			type : "column"
		});
Ext.reg("columnchart", Ext.chart.ColumnChart);
Ext.chart.StackedColumnChart = Ext.extend(Ext.chart.CartesianChart, {
			type : "stackcolumn"
		});
Ext.reg("stackedcolumnchart", Ext.chart.StackedColumnChart);
Ext.chart.BarChart = Ext.extend(Ext.chart.CartesianChart, {
			type : "bar"
		});
Ext.reg("barchart", Ext.chart.BarChart);
Ext.chart.StackedBarChart = Ext.extend(Ext.chart.CartesianChart, {
			type : "stackbar"
		});
Ext.reg("stackedbarchart", Ext.chart.StackedBarChart);
Ext.chart.Axis = function (a) {
	Ext.apply(this, a)
};
Ext.chart.Axis.prototype = {
	type : null,
	orientation : "horizontal",
	reverse : false,
	labelFunction : null,
	hideOverlappingLabels : true,
	labelSpacing : 2
};
Ext.chart.NumericAxis = Ext.extend(Ext.chart.Axis, {
			type : "numeric",
			minimum : NaN,
			maximum : NaN,
			majorUnit : NaN,
			minorUnit : NaN,
			snapToUnits : true,
			alwaysShowZero : true,
			scale : "linear",
			roundMajorUnit : true,
			calculateByLabelSize : true,
			position : "left",
			adjustMaximumByMajorUnit : true,
			adjustMinimumByMajorUnit : true
		});
Ext.chart.TimeAxis = Ext.extend(Ext.chart.Axis, {
			type : "time",
			minimum : null,
			maximum : null,
			majorUnit : NaN,
			majorTimeUnit : null,
			minorUnit : NaN,
			minorTimeUnit : null,
			snapToUnits : true,
			stackingEnabled : false,
			calculateByLabelSize : true
		});
Ext.chart.CategoryAxis = Ext.extend(Ext.chart.Axis, {
			type : "category",
			categoryNames : null,
			calculateCategoryCount : false
		});
Ext.chart.Series = function (a) {
	Ext.apply(this, a)
};
Ext.chart.Series.prototype = {
	type : null,
	displayName : null
};
Ext.chart.CartesianSeries = Ext.extend(Ext.chart.Series, {
			xField : null,
			yField : null,
			showInLegend : true,
			axis : "primary"
		});
Ext.chart.ColumnSeries = Ext.extend(Ext.chart.CartesianSeries, {
			type : "column"
		});
Ext.chart.LineSeries = Ext.extend(Ext.chart.CartesianSeries, {
			type : "line"
		});
Ext.chart.BarSeries = Ext.extend(Ext.chart.CartesianSeries, {
			type : "bar"
		});
Ext.chart.PieSeries = Ext.extend(Ext.chart.Series, {
			type : "pie",
			dataField : null,
			categoryField : null
		});
Ext.menu.Menu = Ext.extend(Ext.Container, {
			minWidth : 120,
			shadow : "sides",
			subMenuAlign : "tl-tr?",
			defaultAlign : "tl-bl?",
			allowOtherMenus : false,
			ignoreParentClicks : false,
			enableScrolling : true,
			maxHeight : null,
			scrollIncrement : 24,
			showSeparator : true,
			defaultOffsets : [0, 0],
			plain : false,
			floating : true,
			zIndex : 15000,
			hidden : true,
			layout : "menu",
			hideMode : "offsets",
			scrollerHeight : 8,
			autoLayout : true,
			defaultType : "menuitem",
			bufferResize : false,
			initComponent : function () {
				if (Ext.isArray(this.initialConfig)) {
					Ext.apply(this, {
							items : this.initialConfig
						})
				}
				this.addEvents("click", "mouseover", "mouseout", "itemclick");
				Ext.menu.MenuMgr.register(this);
				if (this.floating) {
					Ext.EventManager.onWindowResize(this.hide, this)
				} else {
					if (this.initialConfig.hidden !== false) {
						this.hidden = false
					}
					this.internalDefaults = {
						hideOnClick : false
					}
				}
				Ext.menu.Menu.superclass.initComponent.call(this);
				if (this.autoLayout) {
					var a = this.doLayout.createDelegate(this, []);
					this.on({
							add : a,
							remove : a
						})
				}
			},
			getLayoutTarget : function () {
				return this.ul
			},
			onRender : function (b, a) {
				if (!b) {
					b = Ext.getBody()
				}
				var c = {
					id : this.getId(),
					cls : "x-menu " + ((this.floating) ? "x-menu-floating x-layer " : "") + (this.cls || "") + (this.plain ? " x-menu-plain" : "") + (this.showSeparator ? "" : " x-menu-nosep"),
					style : this.style,
					cn : [{
							tag : "a",
							cls : "x-menu-focus",
							href : "#",
							onclick : "return false;",
							tabIndex : "-1"
						}, {
							tag : "ul",
							cls : "x-menu-list"
						}
					]
				};
				if (this.floating) {
					this.el = new Ext.Layer({
								shadow : this.shadow,
								dh : c,
								constrain : false,
								parentEl : b,
								zindex : this.zIndex
							})
				} else {
					this.el = b.createChild(c)
				}
				Ext.menu.Menu.superclass.onRender.call(this, b, a);
				if (!this.keyNav) {
					this.keyNav = new Ext.menu.MenuNav(this)
				}
				this.focusEl = this.el.child("a.x-menu-focus");
				this.ul = this.el.child("ul.x-menu-list");
				this.mon(this.ul, {
						scope : this,
						click : this.onClick,
						mouseover : this.onMouseOver,
						mouseout : this.onMouseOut
					});
				if (this.enableScrolling) {
					this.mon(this.el, {
							scope : this,
							delegate : ".x-menu-scroller",
							click : this.onScroll,
							mouseover : this.deactivateActive
						})
				}
			},
			findTargetItem : function (b) {
				var a = b.getTarget(".x-menu-list-item", this.ul, true);
				if (a && a.menuItemId) {
					return this.items.get(a.menuItemId)
				}
			},
			onClick : function (b) {
				var a = this.findTargetItem(b);
				if (a) {
					if (a.isFormField) {
						this.setActiveItem(a)
					} else {
						if (a instanceof Ext.menu.BaseItem) {
							if (a.menu && this.ignoreParentClicks) {
								a.expandMenu();
								b.preventDefault()
							} else {
								if (a.onClick) {
									a.onClick(b);
									this.fireEvent("click", this, a, b)
								}
							}
						}
					}
				}
			},
			setActiveItem : function (a, b) {
				if (a != this.activeItem) {
					this.deactivateActive();
					if ((this.activeItem = a).isFormField) {
						a.focus()
					} else {
						a.activate(b)
					}
				} else {
					if (b) {
						a.expandMenu()
					}
				}
			},
			deactivateActive : function () {
				var b = this.activeItem;
				if (b) {
					if (b.isFormField) {
						if (b.collapse) {
							b.collapse()
						}
					} else {
						b.deactivate()
					}
					delete this.activeItem
				}
			},
			tryActivate : function (g, e) {
				var b = this.items;
				for (var c = g, a = b.length; c >= 0 && c < a; c += e) {
					var d = b.get(c);
					if (d.isVisible() && !d.disabled && (d.canActivate || d.isFormField)) {
						this.setActiveItem(d, false);
						return d
					}
				}
				return false
			},
			onMouseOver : function (b) {
				var a = this.findTargetItem(b);
				if (a) {
					if (a.canActivate && !a.disabled) {
						this.setActiveItem(a, true)
					}
				}
				this.over = true;
				this.fireEvent("mouseover", this, b, a)
			},
			onMouseOut : function (b) {
				var a = this.findTargetItem(b);
				if (a) {
					if (a == this.activeItem && a.shouldDeactivate && a.shouldDeactivate(b)) {
						this.activeItem.deactivate();
						delete this.activeItem
					}
				}
				this.over = false;
				this.fireEvent("mouseout", this, b, a)
			},
			onScroll : function (d, b) {
				if (d) {
					d.stopEvent()
				}
				var a = this.ul.dom,
				c = Ext.fly(b).is(".x-menu-scroller-top");
				a.scrollTop += this.scrollIncrement * (c ? -1 : 1);
				if (c ? a.scrollTop <= 0 : a.scrollTop + this.activeMax >= a.scrollHeight) {
					this.onScrollerOut(null, b)
				}
			},
			onScrollerIn : function (d, b) {
				var a = this.ul.dom,
				c = Ext.fly(b).is(".x-menu-scroller-top");
				if (c ? a.scrollTop > 0 : a.scrollTop + this.activeMax < a.scrollHeight) {
					Ext.fly(b).addClass(["x-menu-item-active", "x-menu-scroller-active"])
				}
			},
			onScrollerOut : function (b, a) {
				Ext.fly(a).removeClass(["x-menu-item-active", "x-menu-scroller-active"])
			},
			show : function (b, c, a) {
				if (this.floating) {
					this.parentMenu = a;
					if (!this.el) {
						this.render();
						this.doLayout(false, true)
					}
					this.showAt(this.el.getAlignToXY(b, c || this.defaultAlign, this.defaultOffsets), a)
				} else {
					Ext.menu.Menu.superclass.show.call(this)
				}
			},
			showAt : function (b, a) {
				if (this.fireEvent("beforeshow", this) !== false) {
					this.parentMenu = a;
					if (!this.el) {
						this.render()
					}
					if (this.enableScrolling) {
						this.el.setXY(b);
						b[1] = this.constrainScroll(b[1]);
						b = [this.el.adjustForConstraints(b)[0], b[1]]
					} else {
						b = this.el.adjustForConstraints(b)
					}
					this.el.setXY(b);
					this.el.show();
					Ext.menu.Menu.superclass.onShow.call(this);
					if (Ext.isIE) {
						this.fireEvent("autosize", this);
						if (!Ext.isIE8) {
							this.el.repaint()
						}
					}
					this.hidden = false;
					this.focus();
					this.fireEvent("show", this)
				}
			},
			constrainScroll : function (i) {
				var b,
				d = this.ul.setHeight("auto").getHeight(),
				a = i,
				h,
				e,
				g,
				c;
				if (this.floating) {
					e = Ext.fly(this.el.dom.parentNode);
					g = e.getScroll().top;
					c = e.getViewSize().height;
					h = i - g;
					b = this.maxHeight ? this.maxHeight : c - h;
					if (d > c) {
						b = c;
						a = i - h
					} else {
						if (b < d) {
							a = i - (d - b);
							b = d
						}
					}
				} else {
					b = this.getHeight()
				}
				if (this.maxHeight) {
					b = Math.min(this.maxHeight, b)
				}
				if (d > b && b > 0) {
					this.activeMax = b - this.scrollerHeight * 2 - this.el.getFrameWidth("tb") - Ext.num(this.el.shadowOffset, 0);
					this.ul.setHeight(this.activeMax);
					this.createScrollers();
					this.el.select(".x-menu-scroller").setDisplayed("")
				} else {
					this.ul.setHeight(d);
					this.el.select(".x-menu-scroller").setDisplayed("none")
				}
				this.ul.dom.scrollTop = 0;
				return a
			},
			createScrollers : function () {
				if (!this.scroller) {
					this.scroller = {
						pos : 0,
						top : this.el.insertFirst({
								tag : "div",
								cls : "x-menu-scroller x-menu-scroller-top",
								html : "&#160;"
							}),
						bottom : this.el.createChild({
								tag : "div",
								cls : "x-menu-scroller x-menu-scroller-bottom",
								html : "&#160;"
							})
					};
					this.scroller.top.hover(this.onScrollerIn, this.onScrollerOut, this);
					this.scroller.topRepeater = new Ext.util.ClickRepeater(this.scroller.top, {
								listeners : {
									click : this.onScroll.createDelegate(this, [null, this.scroller.top], false)
								}
							});
					this.scroller.bottom.hover(this.onScrollerIn, this.onScrollerOut, this);
					this.scroller.bottomRepeater = new Ext.util.ClickRepeater(this.scroller.bottom, {
								listeners : {
									click : this.onScroll.createDelegate(this, [null, this.scroller.bottom], false)
								}
							})
				}
			},
			onLayout : function () {
				if (this.isVisible()) {
					if (this.enableScrolling) {
						this.constrainScroll(this.el.getTop())
					}
					if (this.floating) {
						this.el.sync()
					}
				}
			},
			focus : function () {
				if (!this.hidden) {
					this.doFocus.defer(50, this)
				}
			},
			doFocus : function () {
				if (!this.hidden) {
					this.focusEl.focus()
				}
			},
			hide : function (a) {
				if (!this.isDestroyed) {
					this.deepHide = a;
					Ext.menu.Menu.superclass.hide.call(this);
					delete this.deepHide
				}
			},
			onHide : function () {
				Ext.menu.Menu.superclass.onHide.call(this);
				this.deactivateActive();
				if (this.el && this.floating) {
					this.el.hide()
				}
				var a = this.parentMenu;
				if (this.deepHide === true && a) {
					if (a.floating) {
						a.hide(true)
					} else {
						a.deactivateActive()
					}
				}
			},
			lookupComponent : function (a) {
				if (Ext.isString(a)) {
					a = (a == "separator" || a == "-") ? new Ext.menu.Separator() : new Ext.menu.TextItem(a);
					this.applyDefaults(a)
				} else {
					if (Ext.isObject(a)) {
						a = this.getMenuItem(a)
					} else {
						if (a.tagName || a.el) {
							a = new Ext.BoxComponent({
										el : a
									})
						}
					}
				}
				return a
			},
			applyDefaults : function (b) {
				if (!Ext.isString(b)) {
					b = Ext.menu.Menu.superclass.applyDefaults.call(this, b);
					var a = this.internalDefaults;
					if (a) {
						if (b.events) {
							Ext.applyIf(b.initialConfig, a);
							Ext.apply(b, a)
						} else {
							Ext.applyIf(b, a)
						}
					}
				}
				return b
			},
			getMenuItem : function (a) {
				a.ownerCt = this;
				if (!a.isXType) {
					if (!a.xtype && Ext.isBoolean(a.checked)) {
						return new Ext.menu.CheckItem(a)
					}
					return Ext.create(a, this.defaultType)
				}
				return a
			},
			addSeparator : function () {
				return this.add(new Ext.menu.Separator())
			},
			addElement : function (a) {
				return this.add(new Ext.menu.BaseItem({
							el : a
						}))
			},
			addItem : function (a) {
				return this.add(a)
			},
			addMenuItem : function (a) {
				return this.add(this.getMenuItem(a))
			},
			addText : function (a) {
				return this.add(new Ext.menu.TextItem(a))
			},
			onDestroy : function () {
				Ext.EventManager.removeResizeListener(this.hide, this);
				var a = this.parentMenu;
				if (a && a.activeChild == this) {
					delete a.activeChild
				}
				delete this.parentMenu;
				Ext.menu.Menu.superclass.onDestroy.call(this);
				Ext.menu.MenuMgr.unregister(this);
				if (this.keyNav) {
					this.keyNav.disable()
				}
				var b = this.scroller;
				if (b) {
					Ext.destroy(b.topRepeater, b.bottomRepeater, b.top, b.bottom)
				}
				Ext.destroy(this.el, this.focusEl, this.ul)
			}
		});
Ext.reg("menu", Ext.menu.Menu);
Ext.menu.MenuNav = Ext.extend(Ext.KeyNav, function () {
			function a(d, c) {
				if (!c.tryActivate(c.items.indexOf(c.activeItem) - 1, -1)) {
					c.tryActivate(c.items.length - 1, -1)
				}
			}
			function b(d, c) {
				if (!c.tryActivate(c.items.indexOf(c.activeItem) + 1, 1)) {
					c.tryActivate(0, 1)
				}
			}
			return {
				constructor : function (c) {
					Ext.menu.MenuNav.superclass.constructor.call(this, c.el);
					this.scope = this.menu = c
				},
				doRelay : function (g, d) {
					var c = g.getKey();
					if (this.menu.activeItem && this.menu.activeItem.isFormField && c != g.TAB) {
						return false
					}
					if (!this.menu.activeItem && g.isNavKeyPress() && c != g.SPACE && c != g.RETURN) {
						this.menu.tryActivate(0, 1);
						return false
					}
					return d.call(this.scope || this, g, this.menu)
				},
				tab : function (d, c) {
					d.stopEvent();
					if (d.shiftKey) {
						a(d, c)
					} else {
						b(d, c)
					}
				},
				up : a,
				down : b,
				right : function (d, c) {
					if (c.activeItem) {
						c.activeItem.expandMenu(true)
					}
				},
				left : function (d, c) {
					c.hide();
					if (c.parentMenu && c.parentMenu.activeItem) {
						c.parentMenu.activeItem.activate()
					}
				},
				enter : function (d, c) {
					if (c.activeItem) {
						d.stopPropagation();
						c.activeItem.onClick(d);
						c.fireEvent("click", this, c.activeItem);
						return true
					}
				}
			}
		}
		());
Ext.menu.MenuMgr = function () {
	var h,
	e,
	b,
	d = {},
	a = false,
	l = new Date();
	function n() {
		h = {};
		e = new Ext.util.MixedCollection();
		b = Ext.getDoc().addKeyListener(27, j);
		b.disable()
	}
	function j() {
		if (e && e.length > 0) {
			var o = e.clone();
			o.each(function (p) {
					p.hide()
				});
			return true
		}
		return false
	}
	function g(o) {
		e.remove(o);
		if (e.length < 1) {
			b.disable();
			Ext.getDoc().un("mousedown", m);
			a = false
		}
	}
	function k(o) {
		var p = e.last();
		l = new Date();
		e.add(o);
		if (!a) {
			b.enable();
			Ext.getDoc().on("mousedown", m);
			a = true
		}
		if (o.parentMenu) {
			o.getEl().setZIndex(parseInt(o.parentMenu.getEl().getStyle("z-index"), 10) + 3);
			o.parentMenu.activeChild = o
		} else {
			if (p && !p.isDestroyed && p.isVisible()) {
				o.getEl().setZIndex(parseInt(p.getEl().getStyle("z-index"), 10) + 3)
			}
		}
	}
	function c(o) {
		if (o.activeChild) {
			o.activeChild.hide()
		}
		if (o.autoHideTimer) {
			clearTimeout(o.autoHideTimer);
			delete o.autoHideTimer
		}
	}
	function i(o) {
		var p = o.parentMenu;
		if (!p && !o.allowOtherMenus) {
			j()
		} else {
			if (p && p.activeChild) {
				p.activeChild.hide()
			}
		}
	}
	function m(o) {
		if (l.getElapsed() > 50 && e.length > 0 && !o.getTarget(".x-menu")) {
			j()
		}
	}
	return {
		hideAll : function () {
			return j()
		},
		register : function (o) {
			if (!h) {
				n()
			}
			h[o.id] = o;
			o.on({
					beforehide : c,
					hide : g,
					beforeshow : i,
					show : k
				})
		},
		get : function (o) {
			if (typeof o == "string") {
				if (!h) {
					return null
				}
				return h[o]
			} else {
				if (o.events) {
					return o
				} else {
					if (typeof o.length == "number") {
						return new Ext.menu.Menu({
								items : o
							})
					} else {
						return Ext.create(o, "menu")
					}
				}
			}
		},
		unregister : function (o) {
			delete h[o.id];
			o.un("beforehide", c);
			o.un("hide", g);
			o.un("beforeshow", i);
			o.un("show", k)
		},
		registerCheckable : function (o) {
			var p = o.group;
			if (p) {
				if (!d[p]) {
					d[p] = []
				}
				d[p].push(o)
			}
		},
		unregisterCheckable : function (o) {
			var p = o.group;
			if (p) {
				d[p].remove(o)
			}
		},
		onCheckChange : function (q, r) {
			if (q.group && r) {
				var t = d[q.group],
				p = 0,
				o = t.length,
				s;
				for (; p < o; p++) {
					s = t[p];
					if (s != q) {
						s.setChecked(false)
					}
				}
			}
		},
		getCheckedItem : function (q) {
			var r = d[q];
			if (r) {
				for (var p = 0, o = r.length; p < o; p++) {
					if (r[p].checked) {
						return r[p]
					}
				}
			}
			return null
		},
		setCheckedItem : function (q, s) {
			var r = d[q];
			if (r) {
				for (var p = 0, o = r.length; p < o; p++) {
					if (r[p].id == s) {
						r[p].setChecked(true)
					}
				}
			}
			return null
		}
	}
}
();
Ext.menu.BaseItem = Ext.extend(Ext.Component, {
			canActivate : false,
			activeClass : "x-menu-item-active",
			hideOnClick : true,
			clickHideDelay : 1,
			ctype : "Ext.menu.BaseItem",
			actionMode : "container",
			initComponent : function () {
				Ext.menu.BaseItem.superclass.initComponent.call(this);
				this.addEvents("click", "activate", "deactivate");
				if (this.handler) {
					this.on("click", this.handler, this.scope)
				}
			},
			onRender : function (b, a) {
				Ext.menu.BaseItem.superclass.onRender.apply(this, arguments);
				if (this.ownerCt && this.ownerCt instanceof Ext.menu.Menu) {
					this.parentMenu = this.ownerCt
				} else {
					this.container.addClass("x-menu-list-item");
					this.mon(this.el, {
							scope : this,
							click : this.onClick,
							mouseenter : this.activate,
							mouseleave : this.deactivate
						})
				}
			},
			setHandler : function (b, a) {
				if (this.handler) {
					this.un("click", this.handler, this.scope)
				}
				this.on("click", this.handler = b, this.scope = a)
			},
			onClick : function (a) {
				if (!this.disabled && this.fireEvent("click", this, a) !== false && (this.parentMenu && this.parentMenu.fireEvent("itemclick", this, a) !== false)) {
					this.handleClick(a)
				} else {
					a.stopEvent()
				}
			},
			activate : function () {
				if (this.disabled) {
					return false
				}
				var a = this.container;
				a.addClass(this.activeClass);
				this.region = a.getRegion().adjust(2, 2, -2, -2);
				this.fireEvent("activate", this);
				return true
			},
			deactivate : function () {
				this.container.removeClass(this.activeClass);
				this.fireEvent("deactivate", this)
			},
			shouldDeactivate : function (a) {
				return !this.region || !this.region.contains(a.getPoint())
			},
			handleClick : function (b) {
				var a = this.parentMenu;
				if (this.hideOnClick) {
					if (a.floating) {
						this.clickHideDelayTimer = a.hide.defer(this.clickHideDelay, a, [true])
					} else {
						a.deactivateActive()
					}
				}
			},
			beforeDestroy : function () {
				clearTimeout(this.clickHideDelayTimer);
				Ext.menu.BaseItem.superclass.beforeDestroy.call(this)
			},
			expandMenu : Ext.emptyFn,
			hideMenu : Ext.emptyFn
		});
Ext.reg("menubaseitem", Ext.menu.BaseItem);
Ext.menu.TextItem = Ext.extend(Ext.menu.BaseItem, {
			hideOnClick : false,
			itemCls : "x-menu-text",
			constructor : function (a) {
				if (typeof a == "string") {
					a = {
						text : a
					}
				}
				Ext.menu.TextItem.superclass.constructor.call(this, a)
			},
			onRender : function () {
				var a = document.createElement("span");
				a.className = this.itemCls;
				a.innerHTML = this.text;
				this.el = a;
				Ext.menu.TextItem.superclass.onRender.apply(this, arguments)
			}
		});
Ext.reg("menutextitem", Ext.menu.TextItem);
Ext.menu.Separator = Ext.extend(Ext.menu.BaseItem, {
			itemCls : "x-menu-sep",
			hideOnClick : false,
			activeClass : "",
			onRender : function (a) {
				var b = document.createElement("span");
				b.className = this.itemCls;
				b.innerHTML = "&#160;";
				this.el = b;
				a.addClass("x-menu-sep-li");
				Ext.menu.Separator.superclass.onRender.apply(this, arguments)
			}
		});
Ext.reg("menuseparator", Ext.menu.Separator);
Ext.menu.Item = Ext.extend(Ext.menu.BaseItem, {
			itemCls : "x-menu-item",
			canActivate : true,
			showDelay : 200,
			altText : "",
			hideDelay : 200,
			ctype : "Ext.menu.Item",
			initComponent : function () {
				Ext.menu.Item.superclass.initComponent.call(this);
				if (this.menu) {
					if (Ext.isArray(this.menu)) {
						this.menu = {
							items : this.menu
						}
					}
					if (Ext.isObject(this.menu)) {
						this.menu.ownerCt = this
					}
					this.menu = Ext.menu.MenuMgr.get(this.menu);
					this.menu.ownerCt = undefined
				}
			},
			onRender : function (d, b) {
				if (!this.itemTpl) {
					this.itemTpl = Ext.menu.Item.prototype.itemTpl = new Ext.XTemplate('<a id="{id}" class="{cls}" hidefocus="true" unselectable="on" href="{href}"', '<tpl if="hrefTarget">', ' target="{hrefTarget}"', "</tpl>", ">", '<img alt="{altText}" src="{icon}" class="x-menu-item-icon {iconCls}"/>', '<span class="x-menu-item-text">{text}</span>', "</a>")
				}
				var c = this.getTemplateArgs();
				this.el = b ? this.itemTpl.insertBefore(b, c, true) : this.itemTpl.append(d, c, true);
				this.iconEl = this.el.child("img.x-menu-item-icon");
				this.textEl = this.el.child(".x-menu-item-text");
				if (!this.href) {
					this.mon(this.el, "click", Ext.emptyFn, null, {
							preventDefault : true
						})
				}
				Ext.menu.Item.superclass.onRender.call(this, d, b)
			},
			getTemplateArgs : function () {
				return {
					id : this.id,
					cls : this.itemCls + (this.menu ? " x-menu-item-arrow" : "") + (this.cls ? " " + this.cls : ""),
					href : this.href || "#",
					hrefTarget : this.hrefTarget,
					icon : this.icon || Ext.BLANK_IMAGE_URL,
					iconCls : this.iconCls || "",
					text : this.itemText || this.text || "&#160;",
					altText : this.altText || ""
				}
			},
			setText : function (a) {
				this.text = a || "&#160;";
				if (this.rendered) {
					this.textEl.update(this.text);
					this.parentMenu.layout.doAutoSize()
				}
			},
			setIconClass : function (a) {
				var b = this.iconCls;
				this.iconCls = a;
				if (this.rendered) {
					this.iconEl.replaceClass(b, this.iconCls)
				}
			},
			beforeDestroy : function () {
				clearTimeout(this.showTimer);
				clearTimeout(this.hideTimer);
				if (this.menu) {
					delete this.menu.ownerCt;
					this.menu.destroy()
				}
				Ext.menu.Item.superclass.beforeDestroy.call(this)
			},
			handleClick : function (a) {
				if (!this.href) {
					a.stopEvent()
				}
				Ext.menu.Item.superclass.handleClick.apply(this, arguments)
			},
			activate : function (a) {
				if (Ext.menu.Item.superclass.activate.apply(this, arguments)) {
					this.focus();
					if (a) {
						this.expandMenu()
					}
				}
				return true
			},
			shouldDeactivate : function (a) {
				if (Ext.menu.Item.superclass.shouldDeactivate.call(this, a)) {
					if (this.menu && this.menu.isVisible()) {
						return !this.menu.getEl().getRegion().contains(a.getPoint())
					}
					return true
				}
				return false
			},
			deactivate : function () {
				Ext.menu.Item.superclass.deactivate.apply(this, arguments);
				this.hideMenu()
			},
			expandMenu : function (a) {
				if (!this.disabled && this.menu) {
					clearTimeout(this.hideTimer);
					delete this.hideTimer;
					if (!this.menu.isVisible() && !this.showTimer) {
						this.showTimer = this.deferExpand.defer(this.showDelay, this, [a])
					} else {
						if (this.menu.isVisible() && a) {
							this.menu.tryActivate(0, 1)
						}
					}
				}
			},
			deferExpand : function (a) {
				delete this.showTimer;
				this.menu.show(this.container, this.parentMenu.subMenuAlign || "tl-tr?", this.parentMenu);
				if (a) {
					this.menu.tryActivate(0, 1)
				}
			},
			hideMenu : function () {
				clearTimeout(this.showTimer);
				delete this.showTimer;
				if (!this.hideTimer && this.menu && this.menu.isVisible()) {
					this.hideTimer = this.deferHide.defer(this.hideDelay, this)
				}
			},
			deferHide : function () {
				delete this.hideTimer;
				if (this.menu.over) {
					this.parentMenu.setActiveItem(this, false)
				} else {
					this.menu.hide()
				}
			}
		});
Ext.reg("menuitem", Ext.menu.Item);
Ext.menu.CheckItem = Ext.extend(Ext.menu.Item, {
			itemCls : "x-menu-item x-menu-check-item",
			groupClass : "x-menu-group-item",
			checked : false,
			ctype : "Ext.menu.CheckItem",
			initComponent : function () {
				Ext.menu.CheckItem.superclass.initComponent.call(this);
				this.addEvents("beforecheckchange", "checkchange");
				if (this.checkHandler) {
					this.on("checkchange", this.checkHandler, this.scope)
				}
				Ext.menu.MenuMgr.registerCheckable(this)
			},
			onRender : function (a) {
				Ext.menu.CheckItem.superclass.onRender.apply(this, arguments);
				if (this.group) {
					this.el.addClass(this.groupClass)
				}
				if (this.checked) {
					this.checked = false;
					this.setChecked(true, true)
				}
			},
			destroy : function () {
				Ext.menu.MenuMgr.unregisterCheckable(this);
				Ext.menu.CheckItem.superclass.destroy.apply(this, arguments)
			},
			setChecked : function (b, a) {
				var c = a === true;
				if (this.checked != b && (c || this.fireEvent("beforecheckchange", this, b) !== false)) {
					Ext.menu.MenuMgr.onCheckChange(this, b);
					if (this.container) {
						this.container[b ? "addClass" : "removeClass"]("x-menu-item-checked")
					}
					this.checked = b;
					if (!c) {
						this.fireEvent("checkchange", this, b)
					}
				}
			},
			handleClick : function (a) {
				if (!this.disabled && !(this.checked && this.group)) {
					this.setChecked(!this.checked)
				}
				Ext.menu.CheckItem.superclass.handleClick.apply(this, arguments)
			}
		});
Ext.reg("menucheckitem", Ext.menu.CheckItem);
Ext.menu.DateMenu = Ext.extend(Ext.menu.Menu, {
			enableScrolling : false,
			hideOnClick : true,
			pickerId : null,
			cls : "x-date-menu",
			initComponent : function () {
				this.on("beforeshow", this.onBeforeShow, this);
				if (this.strict = (Ext.isIE7 && Ext.isStrict)) {
					this.on("show", this.onShow, this, {
							single : true,
							delay : 20
						})
				}
				Ext.apply(this, {
						plain : true,
						showSeparator : false,
						items : this.picker = new Ext.DatePicker(Ext.applyIf({
										internalRender : this.strict || !Ext.isIE,
										ctCls : "x-menu-date-item",
										id : this.pickerId
									}, this.initialConfig))
					});
				this.picker.purgeListeners();
				Ext.menu.DateMenu.superclass.initComponent.call(this);
				this.relayEvents(this.picker, ["select"]);
				this.on("show", this.picker.focus, this.picker);
				this.on("select", this.menuHide, this);
				if (this.handler) {
					this.on("select", this.handler, this.scope || this)
				}
			},
			menuHide : function () {
				if (this.hideOnClick) {
					this.hide(true)
				}
			},
			onBeforeShow : function () {
				if (this.picker) {
					this.picker.hideMonthPicker(true)
				}
			},
			onShow : function () {
				var a = this.picker.getEl();
				a.setWidth(a.getWidth())
			}
		});
Ext.reg("datemenu", Ext.menu.DateMenu);
Ext.menu.ColorMenu = Ext.extend(Ext.menu.Menu, {
			enableScrolling : false,
			hideOnClick : true,
			cls : "x-color-menu",
			paletteId : null,
			initComponent : function () {
				Ext.apply(this, {
						plain : true,
						showSeparator : false,
						items : this.palette = new Ext.ColorPalette(Ext.applyIf({
										id : this.paletteId
									}, this.initialConfig))
					});
				this.palette.purgeListeners();
				Ext.menu.ColorMenu.superclass.initComponent.call(this);
				this.relayEvents(this.palette, ["select"]);
				this.on("select", this.menuHide, this);
				if (this.handler) {
					this.on("select", this.handler, this.scope || this)
				}
			},
			menuHide : function () {
				if (this.hideOnClick) {
					this.hide(true)
				}
			}
		});
Ext.reg("colormenu", Ext.menu.ColorMenu);
Ext.form.Field = Ext.extend(Ext.BoxComponent, {
			invalidClass : "x-form-invalid",
			invalidText : "The value in this field is invalid",
			focusClass : "x-form-focus",
			validationEvent : "keyup",
			validateOnBlur : true,
			validationDelay : 250,
			defaultAutoCreate : {
				tag : "input",
				type : "text",
				size : "20",
				autocomplete : "off"
			},
			fieldClass : "x-form-field",
			msgTarget : "qtip",
			msgFx : "normal",
			readOnly : false,
			disabled : false,
			submitValue : true,
			isFormField : true,
			msgDisplay : "",
			hasFocus : false,
			initComponent : function () {
				Ext.form.Field.superclass.initComponent.call(this);
				this.addEvents("focus", "blur", "specialkey", "change", "invalid", "valid")
			},
			getName : function () {
				return this.rendered && this.el.dom.name ? this.el.dom.name : this.name || this.id || ""
			},
			onRender : function (c, a) {
				if (!this.el) {
					var b = this.getAutoCreate();
					if (!b.name) {
						b.name = this.name || this.id
					}
					if (this.inputType) {
						b.type = this.inputType
					}
					this.autoEl = b
				}
				Ext.form.Field.superclass.onRender.call(this, c, a);
				if (this.submitValue === false) {
					this.el.dom.removeAttribute("name")
				}
				var d = this.el.dom.type;
				if (d) {
					if (d == "password") {
						d = "text"
					}
					this.el.addClass("x-form-" + d)
				}
				if (this.readOnly) {
					this.setReadOnly(true)
				}
				if (this.tabIndex !== undefined) {
					this.el.dom.setAttribute("tabIndex", this.tabIndex)
				}
				this.el.addClass([this.fieldClass, this.cls])
			},
			getItemCt : function () {
				return this.itemCt
			},
			initValue : function () {
				if (this.value !== undefined) {
					this.setValue(this.value)
				} else {
					if (!Ext.isEmpty(this.el.dom.value) && this.el.dom.value != this.emptyText) {
						this.setValue(this.el.dom.value)
					}
				}
				this.originalValue = this.getValue()
			},
			isDirty : function () {
				if (this.disabled || !this.rendered) {
					return false
				}
				return String(this.getValue()) !== String(this.originalValue)
			},
			setReadOnly : function (a) {
				if (this.rendered) {
					this.el.dom.readOnly = a
				}
				this.readOnly = a
			},
			afterRender : function () {
				Ext.form.Field.superclass.afterRender.call(this);
				this.initEvents();
				this.initValue()
			},
			fireKey : function (a) {
				if (a.isSpecialKey()) {
					this.fireEvent("specialkey", this, a)
				}
			},
			reset : function () {
				this.setValue(this.originalValue);
				this.clearInvalid()
			},
			initEvents : function () {
				this.mon(this.el, Ext.EventManager.getKeyEvent(), this.fireKey, this);
				this.mon(this.el, "focus", this.onFocus, this);
				this.mon(this.el, "blur", this.onBlur, this, this.inEditor ? {
						buffer : 10
					}
					 : null)
			},
			preFocus : Ext.emptyFn,
			onFocus : function () {
				this.preFocus();
				if (this.focusClass) {
					this.el.addClass(this.focusClass)
				}
				if (!this.hasFocus) {
					this.hasFocus = true;
					this.startValue = this.getValue();
					this.fireEvent("focus", this)
				}
			},
			beforeBlur : Ext.emptyFn,
			onBlur : function () {
				this.beforeBlur();
				if (this.focusClass) {
					this.el.removeClass(this.focusClass)
				}
				this.hasFocus = false;
				if (this.validationEvent !== false && (this.validateOnBlur || this.validationEvent == "blur")) {
					this.validate()
				}
				var a = this.getValue();
				if (String(a) !== String(this.startValue)) {
					this.fireEvent("change", this, a, this.startValue)
				}
				this.fireEvent("blur", this);
				this.postBlur()
			},
			postBlur : Ext.emptyFn,
			isValid : function (a) {
				if (this.disabled) {
					return true
				}
				var c = this.preventMark;
				this.preventMark = a === true;
				var b = this.validateValue(this.processValue(this.getRawValue()), a);
				this.preventMark = c;
				return b
			},
			validate : function () {
				if (this.disabled || this.validateValue(this.processValue(this.getRawValue()))) {
					this.clearInvalid();
					return true
				}
				return false
			},
			processValue : function (a) {
				return a
			},
			validateValue : function (b) {
				var a = this.getErrors(b)[0];
				if (a == undefined) {
					return true
				} else {
					this.markInvalid(a);
					return false
				}
			},
			getErrors : function () {
				return []
			},
			getActiveError : function () {
				return this.activeError || ""
			},
			markInvalid : function (c) {
				if (this.rendered && !this.preventMark) {
					c = c || this.invalidText;
					var a = this.getMessageHandler();
					if (a) {
						a.mark(this, c)
					} else {
						if (this.msgTarget) {
							this.el.addClass(this.invalidClass);
							var b = Ext.getDom(this.msgTarget);
							if (b) {
								b.innerHTML = c;
								b.style.display = this.msgDisplay
							}
						}
					}
				}
				this.setActiveError(c)
			},
			clearInvalid : function () {
				if (this.rendered && !this.preventMark) {
					this.el.removeClass(this.invalidClass);
					var a = this.getMessageHandler();
					if (a) {
						a.clear(this)
					} else {
						if (this.msgTarget) {
							this.el.removeClass(this.invalidClass);
							var b = Ext.getDom(this.msgTarget);
							if (b) {
								b.innerHTML = "";
								b.style.display = "none"
							}
						}
					}
				}
				this.unsetActiveError()
			},
			setActiveError : function (b, a) {
				this.activeError = b;
				if (a !== true) {
					this.fireEvent("invalid", this, b)
				}
			},
			unsetActiveError : function (a) {
				delete this.activeError;
				if (a !== true) {
					this.fireEvent("valid", this)
				}
			},
			getMessageHandler : function () {
				return Ext.form.MessageTargets[this.msgTarget]
			},
			getErrorCt : function () {
				return this.el.findParent(".x-form-element", 5, true) || this.el.findParent(".x-form-field-wrap", 5, true)
			},
			alignErrorEl : function () {
				this.errorEl.setWidth(this.getErrorCt().getWidth(true) - 20)
			},
			alignErrorIcon : function () {
				this.errorIcon.alignTo(this.el, "tl-tr", [2, 0])
			},
			getRawValue : function () {
				var a = this.rendered ? this.el.getValue() : Ext.value(this.value, "");
				if (a === this.emptyText) {
					a = ""
				}
				return a
			},
			getValue : function () {
				if (!this.rendered) {
					return this.value
				}
				var a = this.el.getValue();
				if (a === this.emptyText || a === undefined) {
					a = ""
				}
				return a
			},
			setRawValue : function (a) {
				return this.rendered ? (this.el.dom.value = (Ext.isEmpty(a) ? "" : a)) : ""
			},
			setValue : function (a) {
				this.value = a;
				if (this.rendered) {
					this.el.dom.value = (Ext.isEmpty(a) ? "" : a);
					this.validate()
				}
				return this
			},
			append : function (a) {
				this.setValue([this.getValue(), a].join(""))
			}
		});
Ext.form.MessageTargets = {
	qtip : {
		mark : function (a, b) {
			a.el.addClass(a.invalidClass);
			a.el.dom.qtip = b;
			a.el.dom.qclass = "x-form-invalid-tip";
			if (Ext.QuickTips) {
				Ext.QuickTips.enable()
			}
		},
		clear : function (a) {
			a.el.removeClass(a.invalidClass);
			a.el.dom.qtip = ""
		}
	},
	title : {
		mark : function (a, b) {
			a.el.addClass(a.invalidClass);
			a.el.dom.title = b
		},
		clear : function (a) {
			a.el.dom.title = ""
		}
	},
	under : {
		mark : function (b, c) {
			b.el.addClass(b.invalidClass);
			if (!b.errorEl) {
				var a = b.getErrorCt();
				if (!a) {
					b.el.dom.title = c;
					return
				}
				b.errorEl = a.createChild({
							cls : "x-form-invalid-msg"
						});
				b.on("resize", b.alignErrorEl, b);
				b.on("destroy", function () {
						Ext.destroy(this.errorEl)
					}, b)
			}
			b.alignErrorEl();
			b.errorEl.update(c);
			Ext.form.Field.msgFx[b.msgFx].show(b.errorEl, b)
		},
		clear : function (a) {
			a.el.removeClass(a.invalidClass);
			if (a.errorEl) {
				Ext.form.Field.msgFx[a.msgFx].hide(a.errorEl, a)
			} else {
				a.el.dom.title = ""
			}
		}
	},
	side : {
		mark : function (b, c) {
			b.el.addClass(b.invalidClass);
			if (!b.errorIcon) {
				var a = b.getErrorCt();
				if (!a) {
					b.el.dom.title = c;
					return
				}
				b.errorIcon = a.createChild({
							cls : "x-form-invalid-icon"
						});
				if (b.ownerCt) {
					b.ownerCt.on("afterlayout", b.alignErrorIcon, b);
					b.ownerCt.on("expand", b.alignErrorIcon, b)
				}
				b.on("resize", b.alignErrorIcon, b);
				b.on("destroy", function () {
						Ext.destroy(this.errorIcon)
					}, b)
			}
			b.alignErrorIcon();
			b.errorIcon.dom.qtip = c;
			b.errorIcon.dom.qclass = "x-form-invalid-tip";
			b.errorIcon.show()
		},
		clear : function (a) {
			a.el.removeClass(a.invalidClass);
			if (a.errorIcon) {
				a.errorIcon.dom.qtip = "";
				a.errorIcon.hide()
			} else {
				a.el.dom.title = ""
			}
		}
	}
};
Ext.form.Field.msgFx = {
	normal : {
		show : function (a, b) {
			a.setDisplayed("block")
		},
		hide : function (a, b) {
			a.setDisplayed(false).update("")
		}
	},
	slide : {
		show : function (a, b) {
			a.slideIn("t", {
					stopFx : true
				})
		},
		hide : function (a, b) {
			a.slideOut("t", {
					stopFx : true,
					useDisplay : true
				})
		}
	},
	slideRight : {
		show : function (a, b) {
			a.fixDisplay();
			a.alignTo(b.el, "tl-tr");
			a.slideIn("l", {
					stopFx : true
				})
		},
		hide : function (a, b) {
			a.slideOut("l", {
					stopFx : true,
					useDisplay : true
				})
		}
	}
};
Ext.reg("field", Ext.form.Field);
Ext.form.TextField = Ext.extend(Ext.form.Field, {
			grow : false,
			growMin : 30,
			growMax : 800,
			vtype : null,
			maskRe : null,
			disableKeyFilter : false,
			allowBlank : true,
			minLength : 0,
			maxLength : Number.MAX_VALUE,
			minLengthText : "The minimum length for this field is {0}",
			maxLengthText : "The maximum length for this field is {0}",
			selectOnFocus : false,
			blankText : "This field is required",
			validator : null,
			regex : null,
			regexText : "",
			emptyText : null,
			emptyClass : "x-form-empty-field",
			initComponent : function () {
				Ext.form.TextField.superclass.initComponent.call(this);
				this.addEvents("autosize", "keydown", "keyup", "keypress")
			},
			initEvents : function () {
				Ext.form.TextField.superclass.initEvents.call(this);
				if (this.validationEvent == "keyup") {
					this.validationTask = new Ext.util.DelayedTask(this.validate, this);
					this.mon(this.el, "keyup", this.filterValidation, this)
				} else {
					if (this.validationEvent !== false && this.validationEvent != "blur") {
						this.mon(this.el, this.validationEvent, this.validate, this, {
								buffer : this.validationDelay
							})
					}
				}
				if (this.selectOnFocus || this.emptyText) {
					this.mon(this.el, "mousedown", this.onMouseDown, this);
					if (this.emptyText) {
						this.applyEmptyText()
					}
				}
				if (this.maskRe || (this.vtype && this.disableKeyFilter !== true && (this.maskRe = Ext.form.VTypes[this.vtype + "Mask"]))) {
					this.mon(this.el, "keypress", this.filterKeys, this)
				}
				if (this.grow) {
					this.mon(this.el, "keyup", this.onKeyUpBuffered, this, {
							buffer : 50
						});
					this.mon(this.el, "click", this.autoSize, this)
				}
				if (this.enableKeyEvents) {
					this.mon(this.el, {
							scope : this,
							keyup : this.onKeyUp,
							keydown : this.onKeyDown,
							keypress : this.onKeyPress
						})
				}
			},
			onMouseDown : function (a) {
				if (!this.hasFocus) {
					this.mon(this.el, "mouseup", Ext.emptyFn, this, {
							single : true,
							preventDefault : true
						})
				}
			},
			processValue : function (a) {
				if (this.stripCharsRe) {
					var b = a.replace(this.stripCharsRe, "");
					if (b !== a) {
						this.setRawValue(b);
						return b
					}
				}
				return a
			},
			filterValidation : function (a) {
				if (!a.isNavKeyPress()) {
					this.validationTask.delay(this.validationDelay)
				}
			},
			onDisable : function () {
				Ext.form.TextField.superclass.onDisable.call(this);
				if (Ext.isIE) {
					this.el.dom.unselectable = "on"
				}
			},
			onEnable : function () {
				Ext.form.TextField.superclass.onEnable.call(this);
				if (Ext.isIE) {
					this.el.dom.unselectable = ""
				}
			},
			onKeyUpBuffered : function (a) {
				if (this.doAutoSize(a)) {
					this.autoSize()
				}
			},
			doAutoSize : function (a) {
				return !a.isNavKeyPress()
			},
			onKeyUp : function (a) {
				this.fireEvent("keyup", this, a)
			},
			onKeyDown : function (a) {
				this.fireEvent("keydown", this, a)
			},
			onKeyPress : function (a) {
				this.fireEvent("keypress", this, a)
			},
			reset : function () {
				Ext.form.TextField.superclass.reset.call(this);
				this.applyEmptyText()
			},
			applyEmptyText : function () {
				if (this.rendered && this.emptyText && this.getRawValue().length < 1 && !this.hasFocus) {
					this.setRawValue(this.emptyText);
					this.el.addClass(this.emptyClass)
				}
			},
			preFocus : function () {
				var a = this.el,
				b;
				if (this.emptyText) {
					if (a.dom.value == this.emptyText) {
						this.setRawValue("");
						b = true
					}
					a.removeClass(this.emptyClass)
				}
				if (this.selectOnFocus || b) {
					a.dom.select()
				}
			},
			postBlur : function () {
				this.applyEmptyText()
			},
			filterKeys : function (b) {
				if (b.ctrlKey) {
					return
				}
				var a = b.getKey();
				if (Ext.isGecko && (b.isNavKeyPress() || a == b.BACKSPACE || (a == b.DELETE && b.button == -1))) {
					return
				}
				var c = String.fromCharCode(b.getCharCode());
				if (!Ext.isGecko && b.isSpecialKey() && !c) {
					return
				}
				if (!this.maskRe.test(c)) {
					b.stopEvent()
				}
			},
			setValue : function (a) {
				if (this.emptyText && this.el && !Ext.isEmpty(a)) {
					this.el.removeClass(this.emptyClass)
				}
				Ext.form.TextField.superclass.setValue.apply(this, arguments);
				this.applyEmptyText();
				this.autoSize();
				return this
			},
			getErrors : function (a) {
				var d = Ext.form.TextField.superclass.getErrors.apply(this, arguments);
				a = Ext.isDefined(a) ? a : this.processValue(this.getRawValue());
				if (Ext.isFunction(this.validator)) {
					var c = this.validator(a);
					if (c !== true) {
						d.push(c)
					}
				}
				if (a.length < 1 || a === this.emptyText) {
					if (this.allowBlank) {
						return d
					} else {
						d.push(this.blankText)
					}
				}
				if (!this.allowBlank && (a.length < 1 || a === this.emptyText)) {
					d.push(this.blankText)
				}
				if (a.length < this.minLength) {
					d.push(String.format(this.minLengthText, this.minLength))
				}
				if (a.length > this.maxLength) {
					d.push(String.format(this.maxLengthText, this.maxLength))
				}
				if (this.vtype) {
					var b = Ext.form.VTypes;
					if (!b[this.vtype](a, this)) {
						d.push(this.vtypeText || b[this.vtype + "Text"])
					}
				}
				if (this.regex && !this.regex.test(a)) {
					d.push(this.regexText)
				}
				return d
			},
			selectText : function (h, a) {
				var c = this.getRawValue();
				var e = false;
				if (c.length > 0) {
					h = h === undefined ? 0 : h;
					a = a === undefined ? c.length : a;
					var g = this.el.dom;
					if (g.setSelectionRange) {
						g.setSelectionRange(h, a)
					} else {
						if (g.createTextRange) {
							var b = g.createTextRange();
							b.moveStart("character", h);
							b.moveEnd("character", a - c.length);
							b.select()
						}
					}
					e = Ext.isGecko || Ext.isOpera
				} else {
					e = true
				}
				if (e) {
					this.focus()
				}
			},
			autoSize : function () {
				if (!this.grow || !this.rendered) {
					return
				}
				if (!this.metrics) {
					this.metrics = Ext.util.TextMetrics.createInstance(this.el)
				}
				var c = this.el;
				var b = c.dom.value;
				var e = document.createElement("div");
				e.appendChild(document.createTextNode(b));
				b = e.innerHTML;
				Ext.removeNode(e);
				e = null;
				b += "&#160;";
				var a = Math.min(this.growMax, Math.max(this.metrics.getWidth(b) + 10, this.growMin));
				this.el.setWidth(a);
				this.fireEvent("autosize", this, a)
			},
			onDestroy : function () {
				if (this.validationTask) {
					this.validationTask.cancel();
					this.validationTask = null
				}
				Ext.form.TextField.superclass.onDestroy.call(this)
			}
		});
Ext.reg("textfield", Ext.form.TextField);
Ext.form.TriggerField = Ext.extend(Ext.form.TextField, {
			defaultAutoCreate : {
				tag : "input",
				type : "text",
				size : "16",
				autocomplete : "off"
			},
			hideTrigger : false,
			editable : true,
			readOnly : false,
			wrapFocusClass : "x-trigger-wrap-focus",
			autoSize : Ext.emptyFn,
			monitorTab : true,
			deferHeight : true,
			mimicing : false,
			actionMode : "wrap",
			defaultTriggerWidth : 17,
			onResize : function (a, c) {
				Ext.form.TriggerField.superclass.onResize.call(this, a, c);
				var b = this.getTriggerWidth();
				if (Ext.isNumber(a)) {
					this.el.setWidth(a - b)
				}
				this.wrap.setWidth(this.el.getWidth() + b)
			},
			getTriggerWidth : function () {
				var a = this.trigger.getWidth();
				if (!this.hideTrigger && !this.readOnly && a === 0) {
					a = this.defaultTriggerWidth
				}
				return a
			},
			alignErrorIcon : function () {
				if (this.wrap) {
					this.errorIcon.alignTo(this.wrap, "tl-tr", [2, 0])
				}
			},
			onRender : function (b, a) {
				this.doc = Ext.isIE ? Ext.getBody() : Ext.getDoc();
				Ext.form.TriggerField.superclass.onRender.call(this, b, a);
				this.wrap = this.el.wrap({
							cls : "x-form-field-wrap x-form-field-trigger-wrap"
						});
				this.trigger = this.wrap.createChild(this.triggerConfig || {
							tag : "img",
							src : Ext.BLANK_IMAGE_URL,
							alt : "",
							cls : "x-form-trigger " + this.triggerClass
						});
				this.initTrigger();
				if (!this.width) {
					this.wrap.setWidth(this.el.getWidth() + this.trigger.getWidth())
				}
				this.resizeEl = this.positionEl = this.wrap
			},
			getWidth : function () {
				return (this.el.getWidth() + this.trigger.getWidth())
			},
			updateEditState : function () {
				if (this.rendered) {
					if (this.readOnly) {
						this.el.dom.readOnly = true;
						this.el.addClass("x-trigger-noedit");
						this.mun(this.el, "click", this.onTriggerClick, this);
						this.trigger.setDisplayed(false)
					} else {
						if (!this.editable) {
							this.el.dom.readOnly = true;
							this.el.addClass("x-trigger-noedit");
							this.mon(this.el, "click", this.onTriggerClick, this)
						} else {
							this.el.dom.readOnly = false;
							this.el.removeClass("x-trigger-noedit");
							this.mun(this.el, "click", this.onTriggerClick, this)
						}
						this.trigger.setDisplayed(!this.hideTrigger)
					}
					this.onResize(this.width || this.wrap.getWidth())
				}
			},
			setHideTrigger : function (a) {
				if (a != this.hideTrigger) {
					this.hideTrigger = a;
					this.updateEditState()
				}
			},
			setEditable : function (a) {
				if (a != this.editable) {
					this.editable = a;
					this.updateEditState()
				}
			},
			setReadOnly : function (a) {
				if (a != this.readOnly) {
					this.readOnly = a;
					this.updateEditState()
				}
			},
			afterRender : function () {
				Ext.form.TriggerField.superclass.afterRender.call(this);
				this.updateEditState()
			},
			initTrigger : function () {
				this.mon(this.trigger, "click", this.onTriggerClick, this, {
						preventDefault : true
					});
				this.trigger.addClassOnOver("x-form-trigger-over");
				this.trigger.addClassOnClick("x-form-trigger-click")
			},
			onDestroy : function () {
				Ext.destroy(this.trigger, this.wrap);
				if (this.mimicing) {
					this.doc.un("mousedown", this.mimicBlur, this)
				}
				delete this.doc;
				Ext.form.TriggerField.superclass.onDestroy.call(this)
			},
			onFocus : function () {
				Ext.form.TriggerField.superclass.onFocus.call(this);
				if (!this.mimicing) {
					this.wrap.addClass(this.wrapFocusClass);
					this.mimicing = true;
					this.doc.on("mousedown", this.mimicBlur, this, {
							delay : 10
						});
					if (this.monitorTab) {
						this.on("specialkey", this.checkTab, this)
					}
				}
			},
			checkTab : function (a, b) {
				if (b.getKey() == b.TAB) {
					this.triggerBlur()
				}
			},
			onBlur : Ext.emptyFn,
			mimicBlur : function (a) {
				if (!this.isDestroyed && !this.wrap.contains(a.target) && this.validateBlur(a)) {
					this.triggerBlur()
				}
			},
			triggerBlur : function () {
				this.mimicing = false;
				this.doc.un("mousedown", this.mimicBlur, this);
				if (this.monitorTab && this.el) {
					this.un("specialkey", this.checkTab, this)
				}
				Ext.form.TriggerField.superclass.onBlur.call(this);
				if (this.wrap) {
					this.wrap.removeClass(this.wrapFocusClass)
				}
			},
			beforeBlur : Ext.emptyFn,
			validateBlur : function (a) {
				return true
			},
			onTriggerClick : Ext.emptyFn
		});
Ext.form.TwinTriggerField = Ext.extend(Ext.form.TriggerField, {
			initComponent : function () {
				Ext.form.TwinTriggerField.superclass.initComponent.call(this);
				this.triggerConfig = {
					tag : "span",
					cls : "x-form-twin-triggers",
					cn : [{
							tag : "img",
							src : Ext.BLANK_IMAGE_URL,
							alt : "",
							cls : "x-form-trigger " + this.trigger1Class
						}, {
							tag : "img",
							src : Ext.BLANK_IMAGE_URL,
							alt : "",
							cls : "x-form-trigger " + this.trigger2Class
						}
					]
				}
			},
			getTrigger : function (a) {
				return this.triggers[a]
			},
			afterRender : function () {
				Ext.form.TwinTriggerField.superclass.afterRender.call(this);
				var c = this.triggers,
				b = 0,
				a = c.length;
				for (; b < a; ++b) {
					if (this["hideTrigger" + (b + 1)]) {
						c[b].hide()
					}
				}
			},
			initTrigger : function () {
				var a = this.trigger.select(".x-form-trigger", true),
				b = this;
				a.each(function (d, g, c) {
						var e = "Trigger" + (c + 1);
						d.hide = function () {
							var h = b.wrap.getWidth();
							this.dom.style.display = "none";
							b.el.setWidth(h - b.trigger.getWidth());
							b["hidden" + e] = true
						};
						d.show = function () {
							var h = b.wrap.getWidth();
							this.dom.style.display = "";
							b.el.setWidth(h - b.trigger.getWidth());
							b["hidden" + e] = false
						};
						this.mon(d, "click", this["on" + e + "Click"], this, {
								preventDefault : true
							});
						d.addClassOnOver("x-form-trigger-over");
						d.addClassOnClick("x-form-trigger-click")
					}, this);
				this.triggers = a.elements
			},
			getTriggerWidth : function () {
				var a = 0;
				Ext.each(this.triggers, function (d, c) {
						var e = "Trigger" + (c + 1),
						b = d.getWidth();
						if (b === 0 && !this["hidden" + e]) {
							a += this.defaultTriggerWidth
						} else {
							a += b
						}
					}, this);
				return a
			},
			onDestroy : function () {
				Ext.destroy(this.triggers);
				Ext.form.TwinTriggerField.superclass.onDestroy.call(this)
			},
			onTrigger1Click : Ext.emptyFn,
			onTrigger2Click : Ext.emptyFn
		});
Ext.reg("trigger", Ext.form.TriggerField);
Ext.form.TextArea = Ext.extend(Ext.form.TextField, {
			growMin : 60,
			growMax : 1000,
			growAppend : "&#160;\n&#160;",
			enterIsSpecial : false,
			preventScrollbars : false,
			onRender : function (b, a) {
				if (!this.el) {
					this.defaultAutoCreate = {
						tag : "textarea",
						style : "width:100px;height:60px;",
						autocomplete : "off"
					}
				}
				Ext.form.TextArea.superclass.onRender.call(this, b, a);
				if (this.grow) {
					this.textSizeEl = Ext.DomHelper.append(document.body, {
								tag : "pre",
								cls : "x-form-grow-sizer"
							});
					if (this.preventScrollbars) {
						this.el.setStyle("overflow", "hidden")
					}
					this.el.setHeight(this.growMin)
				}
			},
			onDestroy : function () {
				Ext.removeNode(this.textSizeEl);
				Ext.form.TextArea.superclass.onDestroy.call(this)
			},
			fireKey : function (a) {
				if (a.isSpecialKey() && (this.enterIsSpecial || (a.getKey() != a.ENTER || a.hasModifier()))) {
					this.fireEvent("specialkey", this, a)
				}
			},
			doAutoSize : function (a) {
				return !a.isNavKeyPress() || a.getKey() == a.ENTER
			},
			filterValidation : function (a) {
				if (!a.isNavKeyPress() || (!this.enterIsSpecial && a.keyCode == a.ENTER)) {
					this.validationTask.delay(this.validationDelay)
				}
			},
			autoSize : function () {
				if (!this.grow || !this.textSizeEl) {
					return
				}
				var c = this.el,
				a = Ext.util.Format.htmlEncode(c.dom.value),
				d = this.textSizeEl,
				b;
				Ext.fly(d).setWidth(this.el.getWidth());
				if (a.length < 1) {
					a = "&#160;&#160;"
				} else {
					a += this.growAppend;
					if (Ext.isIE) {
						a = a.replace(/\n/g, "&#160;<br />")
					}
				}
				d.innerHTML = a;
				b = Math.min(this.growMax, Math.max(d.offsetHeight, this.growMin));
				if (b != this.lastHeight) {
					this.lastHeight = b;
					this.el.setHeight(b);
					this.fireEvent("autosize", this, b)
				}
			}
		});
Ext.reg("textarea", Ext.form.TextArea);
Ext.form.NumberField = Ext.extend(Ext.form.TextField, {
			fieldClass : "x-form-field x-form-num-field",
			allowDecimals : true,
			decimalSeparator : ".",
			decimalPrecision : 2,
			allowNegative : true,
			minValue : Number.NEGATIVE_INFINITY,
			maxValue : Number.MAX_VALUE,
			minText : "The minimum value for this field is {0}",
			maxText : "The maximum value for this field is {0}",
			nanText : "{0} is not a valid number",
			baseChars : "0123456789",
			autoStripChars : false,
			initEvents : function () {
				var a = this.baseChars + "";
				if (this.allowDecimals) {
					a += this.decimalSeparator
				}
				if (this.allowNegative) {
					a += "-"
				}
				a = Ext.escapeRe(a);
				this.maskRe = new RegExp("[" + a + "]");
				if (this.autoStripChars) {
					this.stripCharsRe = new RegExp("[^" + a + "]", "gi")
				}
				Ext.form.NumberField.superclass.initEvents.call(this)
			},
			getErrors : function (b) {
				var c = Ext.form.NumberField.superclass.getErrors.apply(this, arguments);
				b = Ext.isDefined(b) ? b : this.processValue(this.getRawValue());
				if (b.length < 1) {
					return c
				}
				b = String(b).replace(this.decimalSeparator, ".");
				if (isNaN(b)) {
					c.push(String.format(this.nanText, b))
				}
				var a = this.parseValue(b);
				if (a < this.minValue) {
					c.push(String.format(this.minText, this.minValue))
				}
				if (a > this.maxValue) {
					c.push(String.format(this.maxText, this.maxValue))
				}
				return c
			},
			getValue : function () {
				return this.fixPrecision(this.parseValue(Ext.form.NumberField.superclass.getValue.call(this)))
			},
			setValue : function (a) {
				a = Ext.isNumber(a) ? a : parseFloat(String(a).replace(this.decimalSeparator, "."));
				a = this.fixPrecision(a);
				a = isNaN(a) ? "" : String(a).replace(".", this.decimalSeparator);
				return Ext.form.NumberField.superclass.setValue.call(this, a)
			},
			setMinValue : function (a) {
				this.minValue = Ext.num(a, Number.NEGATIVE_INFINITY)
			},
			setMaxValue : function (a) {
				this.maxValue = Ext.num(a, Number.MAX_VALUE)
			},
			parseValue : function (a) {
				a = parseFloat(String(a).replace(this.decimalSeparator, "."));
				return isNaN(a) ? "" : a
			},
			fixPrecision : function (b) {
				var a = isNaN(b);
				if (!this.allowDecimals || this.decimalPrecision == -1 || a || !b) {
					return a ? "" : b
				}
				return parseFloat(parseFloat(b).toFixed(this.decimalPrecision))
			},
			beforeBlur : function () {
				var a = this.parseValue(this.getRawValue());
				if (!Ext.isEmpty(a)) {
					this.setValue(a)
				}
			}
		});
Ext.reg("numberfield", Ext.form.NumberField);
Ext.form.DateField = Ext.extend(Ext.form.TriggerField, {
			format : "m/d/Y",
			altFormats : "m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d|n-j|n/j",
			disabledDaysText : "Disabled",
			disabledDatesText : "Disabled",
			minText : "The date in this field must be equal to or after {0}",
			maxText : "The date in this field must be equal to or before {0}",
			invalidText : "{0} is not a valid date - it must be in the format {1}",
			triggerClass : "x-form-date-trigger",
			showToday : true,
			startDay : 0,
			defaultAutoCreate : {
				tag : "input",
				type : "text",
				size : "10",
				autocomplete : "off"
			},
			initTime : "12",
			initTimeFormat : "H",
			safeParse : function (b, c) {
				if (Date.formatContainsHourInfo(c)) {
					return Date.parseDate(b, c)
				} else {
					var a = Date.parseDate(b + " " + this.initTime, c + " " + this.initTimeFormat);
					if (a) {
						return a.clearTime()
					}
				}
			},
			initComponent : function () {
				Ext.form.DateField.superclass.initComponent.call(this);
				this.addEvents("select");
				if (Ext.isString(this.minValue)) {
					this.minValue = this.parseDate(this.minValue)
				}
				if (Ext.isString(this.maxValue)) {
					this.maxValue = this.parseDate(this.maxValue)
				}
				this.disabledDatesRE = null;
				this.initDisabledDays()
			},
			initEvents : function () {
				Ext.form.DateField.superclass.initEvents.call(this);
				this.keyNav = new Ext.KeyNav(this.el, {
							down : function (a) {
								this.onTriggerClick()
							},
							scope : this,
							forceKeyDown : true
						})
			},
			initDisabledDays : function () {
				if (this.disabledDates) {
					var b = this.disabledDates,
					a = b.length - 1,
					c = "(?:";
					Ext.each(b, function (g, e) {
							c += Ext.isDate(g) ? "^" + Ext.escapeRe(g.dateFormat(this.format)) + "$" : b[e];
							if (e != a) {
								c += "|"
							}
						}, this);
					this.disabledDatesRE = new RegExp(c + ")")
				}
			},
			setDisabledDates : function (a) {
				this.disabledDates = a;
				this.initDisabledDays();
				if (this.menu) {
					this.menu.picker.setDisabledDates(this.disabledDatesRE)
				}
			},
			setDisabledDays : function (a) {
				this.disabledDays = a;
				if (this.menu) {
					this.menu.picker.setDisabledDays(a)
				}
			},
			setMinValue : function (a) {
				this.minValue = (Ext.isString(a) ? this.parseDate(a) : a);
				if (this.menu) {
					this.menu.picker.setMinDate(this.minValue)
				}
			},
			setMaxValue : function (a) {
				this.maxValue = (Ext.isString(a) ? this.parseDate(a) : a);
				if (this.menu) {
					this.menu.picker.setMaxDate(this.maxValue)
				}
			},
			getErrors : function (e) {
				var h = Ext.form.DateField.superclass.getErrors.apply(this, arguments);
				e = this.formatDate(e || this.processValue(this.getRawValue()));
				if (e.length < 1) {
					return h
				}
				var c = e;
				e = this.parseDate(e);
				if (!e) {
					h.push(String.format(this.invalidText, c, this.format));
					return h
				}
				var g = e.getTime();
				if (this.minValue && g < this.minValue.clearTime().getTime()) {
					h.push(String.format(this.minText, this.formatDate(this.minValue)))
				}
				if (this.maxValue && g > this.maxValue.clearTime().getTime()) {
					h.push(String.format(this.maxText, this.formatDate(this.maxValue)))
				}
				if (this.disabledDays) {
					var a = e.getDay();
					for (var b = 0; b < this.disabledDays.length; b++) {
						if (a === this.disabledDays[b]) {
							h.push(this.disabledDaysText);
							break
						}
					}
				}
				var d = this.formatDate(e);
				if (this.disabledDatesRE && this.disabledDatesRE.test(d)) {
					h.push(String.format(this.disabledDatesText, d))
				}
				return h
			},
			validateBlur : function () {
				return !this.menu || !this.menu.isVisible()
			},
			getValue : function () {
				return this.parseDate(Ext.form.DateField.superclass.getValue.call(this)) || ""
			},
			setValue : function (a) {
				return Ext.form.DateField.superclass.setValue.call(this, this.formatDate(this.parseDate(a)))
			},
			parseDate : function (g) {
				if (!g || Ext.isDate(g)) {
					return g
				}
				var b = this.safeParse(g, this.format),
				c = this.altFormats,
				e = this.altFormatsArray;
				if (!b && c) {
					e = e || c.split("|");
					for (var d = 0, a = e.length; d < a && !b; d++) {
						b = this.safeParse(g, e[d])
					}
				}
				return b
			},
			onDestroy : function () {
				Ext.destroy(this.menu, this.keyNav);
				Ext.form.DateField.superclass.onDestroy.call(this)
			},
			formatDate : function (a) {
				return Ext.isDate(a) ? a.dateFormat(this.format) : a
			},
			onTriggerClick : function () {
				if (this.disabled) {
					return
				}
				if (this.menu == null) {
					this.menu = new Ext.menu.DateMenu({
								hideOnClick : false,
								focusOnSelect : false
							})
				}
				this.onFocus();
				Ext.apply(this.menu.picker, {
						minDate : this.minValue,
						maxDate : this.maxValue,
						disabledDatesRE : this.disabledDatesRE,
						disabledDatesText : this.disabledDatesText,
						disabledDays : this.disabledDays,
						disabledDaysText : this.disabledDaysText,
						format : this.format,
						showToday : this.showToday,
						startDay : this.startDay,
						minText : String.format(this.minText, this.formatDate(this.minValue)),
						maxText : String.format(this.maxText, this.formatDate(this.maxValue))
					});
				this.menu.picker.setValue(this.getValue() || new Date());
				this.menu.show(this.el, "tl-bl?");
				this.menuEvents("on")
			},
			menuEvents : function (a) {
				this.menu[a]("select", this.onSelect, this);
				this.menu[a]("hide", this.onMenuHide, this);
				this.menu[a]("show", this.onFocus, this)
			},
			onSelect : function (a, b) {
				this.setValue(b);
				this.fireEvent("select", this, b);
				this.menu.hide()
			},
			onMenuHide : function () {
				this.focus(false, 60);
				this.menuEvents("un")
			},
			beforeBlur : function () {
				var a = this.parseDate(this.getRawValue());
				if (a) {
					this.setValue(a)
				}
			}
		});
Ext.reg("datefield", Ext.form.DateField);
Ext.form.DisplayField = Ext.extend(Ext.form.Field, {
			validationEvent : false,
			validateOnBlur : false,
			defaultAutoCreate : {
				tag : "div"
			},
			fieldClass : "x-form-display-field",
			htmlEncode : false,
			initEvents : Ext.emptyFn,
			isValid : function () {
				return true
			},
			validate : function () {
				return true
			},
			getRawValue : function () {
				var a = this.rendered ? this.el.dom.innerHTML : Ext.value(this.value, "");
				if (a === this.emptyText) {
					a = ""
				}
				if (this.htmlEncode) {
					a = Ext.util.Format.htmlDecode(a)
				}
				return a
			},
			getValue : function () {
				return this.getRawValue()
			},
			getName : function () {
				return this.name
			},
			setRawValue : function (a) {
				if (this.htmlEncode) {
					a = Ext.util.Format.htmlEncode(a)
				}
				return this.rendered ? (this.el.dom.innerHTML = (Ext.isEmpty(a) ? "" : a)) : (this.value = a)
			},
			setValue : function (a) {
				this.setRawValue(a);
				return this
			}
		});
Ext.reg("displayfield", Ext.form.DisplayField);
Ext.form.ComboBox = Ext.extend(Ext.form.TriggerField, {
			defaultAutoCreate : {
				tag : "input",
				type : "text",
				size : "24",
				autocomplete : "off"
			},
			listClass : "",
			selectedClass : "x-combo-selected",
			listEmptyText : "",
			triggerClass : "x-form-arrow-trigger",
			shadow : "sides",
			listAlign : "tl-bl?",
			maxHeight : 300,
			minHeight : 90,
			triggerAction : "query",
			minChars : 4,
			autoSelect : true,
			typeAhead : false,
			queryDelay : 500,
			pageSize : 0,
			selectOnFocus : false,
			queryParam : "query",
			loadingText : "Loading...",
			resizable : false,
			handleHeight : 8,
			allQuery : "",
			mode : "remote",
			minListWidth : 70,
			forceSelection : false,
			typeAheadDelay : 250,
			lazyInit : true,
			clearFilterOnReset : true,
			submitValue : undefined,
			initComponent : function () {
				Ext.form.ComboBox.superclass.initComponent.call(this);
				this.addEvents("expand", "collapse", "beforeselect", "select", "beforequery");
				if (this.transform) {
					var c = Ext.getDom(this.transform);
					if (!this.hiddenName) {
						this.hiddenName = c.name
					}
					if (!this.store) {
						this.mode = "local";
						var j = [],
						e = c.options;
						for (var b = 0, a = e.length; b < a; b++) {
							var h = e[b],
							g = (h.hasAttribute ? h.hasAttribute("value") : h.getAttributeNode("value").specified) ? h.value : h.text;
							if (h.selected && Ext.isEmpty(this.value, true)) {
								this.value = g
							}
							j.push([g, h.text])
						}
						this.store = new Ext.data.ArrayStore({
									idIndex : 0,
									fields : ["value", "text"],
									data : j,
									autoDestroy : true
								});
						this.valueField = "value";
						this.displayField = "text"
					}
					c.name = Ext.id();
					if (!this.lazyRender) {
						this.target = true;
						this.el = Ext.DomHelper.insertBefore(c, this.autoCreate || this.defaultAutoCreate);
						this.render(this.el.parentNode, c)
					}
					Ext.removeNode(c)
				} else {
					if (this.store) {
						this.store = Ext.StoreMgr.lookup(this.store);
						if (this.store.autoCreated) {
							this.displayField = this.valueField = "field1";
							if (!this.store.expandData) {
								this.displayField = "field2"
							}
							this.mode = "local"
						}
					}
				}
				this.selectedIndex = -1;
				if (this.mode == "local") {
					if (!Ext.isDefined(this.initialConfig.queryDelay)) {
						this.queryDelay = 10
					}
					if (!Ext.isDefined(this.initialConfig.minChars)) {
						this.minChars = 0
					}
				}
			},
			onRender : function (b, a) {
				if (this.hiddenName && !Ext.isDefined(this.submitValue)) {
					this.submitValue = false
				}
				Ext.form.ComboBox.superclass.onRender.call(this, b, a);
				if (this.hiddenName) {
					this.hiddenField = this.el.insertSibling({
								tag : "input",
								type : "hidden",
								name : this.hiddenName,
								id : (this.hiddenId || Ext.id())
							}, "before", true)
				}
				if (Ext.isGecko) {
					this.el.dom.setAttribute("autocomplete", "off")
				}
				if (!this.lazyInit) {
					this.initList()
				} else {
					this.on("focus", this.initList, this, {
							single : true
						})
				}
			},
			initValue : function () {
				Ext.form.ComboBox.superclass.initValue.call(this);
				if (this.hiddenField) {
					this.hiddenField.value = Ext.value(Ext.isDefined(this.hiddenValue) ? this.hiddenValue : this.value, "")
				}
			},
			getParentZIndex : function () {
				var a;
				if (this.ownerCt) {
					this.findParentBy(function (b) {
							a = parseInt(b.getPositionEl().getStyle("z-index"), 10);
							return !!a
						})
				}
				return a
			},
			getZIndex : function (b) {
				b = b || Ext.getDom(this.getListParent() || Ext.getBody());
				var a = parseInt(Ext.fly(b).getStyle("z-index"), 10);
				if (!a) {
					a = this.getParentZIndex()
				}
				return (a || 12000) + 5
			},
			initList : function () {
				if (!this.list) {
					var a = "x-combo-list",
					c = Ext.getDom(this.getListParent() || Ext.getBody());
					this.list = new Ext.Layer({
								parentEl : c,
								shadow : this.shadow,
								cls : [a, this.listClass].join(" "),
								constrain : false,
								zindex : this.getZIndex(c)
							});
					var b = this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth);
					this.list.setSize(b, 0);
					this.list.swallowEvent("mousewheel");
					this.assetHeight = 0;
					if (this.syncFont !== false) {
						this.list.setStyle("font-size", this.el.getStyle("font-size"))
					}
					if (this.title) {
						this.header = this.list.createChild({
									cls : a + "-hd",
									html : this.title
								});
						this.assetHeight += this.header.getHeight()
					}
					this.innerList = this.list.createChild({
								cls : a + "-inner"
							});
					this.mon(this.innerList, "mouseover", this.onViewOver, this);
					this.mon(this.innerList, "mousemove", this.onViewMove, this);
					this.innerList.setWidth(b - this.list.getFrameWidth("lr"));
					if (this.pageSize) {
						this.footer = this.list.createChild({
									cls : a + "-ft"
								});
						this.pageTb = new Ext.PagingToolbar({
									store : this.store,
									pageSize : this.pageSize,
									renderTo : this.footer
								});
						this.assetHeight += this.footer.getHeight()
					}
					if (!this.tpl) {
						this.tpl = '<tpl for="."><div class="' + a + '-item">{' + this.displayField + "}</div></tpl>"
					}
					this.view = new Ext.DataView({
								applyTo : this.innerList,
								tpl : this.tpl,
								singleSelect : true,
								selectedClass : this.selectedClass,
								itemSelector : this.itemSelector || "." + a + "-item",
								emptyText : this.listEmptyText,
								deferEmptyText : false
							});
					this.mon(this.view, {
							containerclick : this.onViewClick,
							click : this.onViewClick,
							scope : this
						});
					this.bindStore(this.store, true);
					if (this.resizable) {
						this.resizer = new Ext.Resizable(this.list, {
									pinned : true,
									handles : "se"
								});
						this.mon(this.resizer, "resize", function (g, d, e) {
								this.maxHeight = e - this.handleHeight - this.list.getFrameWidth("tb") - this.assetHeight;
								this.listWidth = d;
								this.innerList.setWidth(d - this.list.getFrameWidth("lr"));
								this.restrictHeight()
							}, this);
						this[this.pageSize ? "footer" : "innerList"].setStyle("margin-bottom", this.handleHeight + "px")
					}
				}
			},
			getListParent : function () {
				return document.body
			},
			getStore : function () {
				return this.store
			},
			bindStore : function (a, b) {
				if (this.store && !b) {
					if (this.store !== a && this.store.autoDestroy) {
						this.store.destroy()
					} else {
						this.store.un("beforeload", this.onBeforeLoad, this);
						this.store.un("load", this.onLoad, this);
						this.store.un("exception", this.collapse, this)
					}
					if (!a) {
						this.store = null;
						if (this.view) {
							this.view.bindStore(null)
						}
						if (this.pageTb) {
							this.pageTb.bindStore(null)
						}
					}
				}
				if (a) {
					if (!b) {
						this.lastQuery = null;
						if (this.pageTb) {
							this.pageTb.bindStore(a)
						}
					}
					this.store = Ext.StoreMgr.lookup(a);
					this.store.on({
							scope : this,
							beforeload : this.onBeforeLoad,
							load : this.onLoad,
							exception : this.collapse
						});
					if (this.view) {
						this.view.bindStore(a)
					}
				}
			},
			reset : function () {
				if (this.clearFilterOnReset && this.mode == "local") {
					this.store.clearFilter()
				}
				Ext.form.ComboBox.superclass.reset.call(this)
			},
			initEvents : function () {
				Ext.form.ComboBox.superclass.initEvents.call(this);
				this.keyNav = new Ext.KeyNav(this.el, {
							up : function (a) {
								this.inKeyMode = true;
								this.selectPrev()
							},
							down : function (a) {
								if (!this.isExpanded()) {
									this.onTriggerClick()
								} else {
									this.inKeyMode = true;
									this.selectNext()
								}
							},
							enter : function (a) {
								this.onViewClick()
							},
							esc : function (a) {
								this.collapse()
							},
							tab : function (a) {
								if (this.forceSelection === true) {
									this.collapse()
								} else {
									this.onViewClick(false)
								}
								return true
							},
							scope : this,
							doRelay : function (c, b, a) {
								if (a == "down" || this.scope.isExpanded()) {
									var d = Ext.KeyNav.prototype.doRelay.apply(this, arguments);
									if (!Ext.isIE && Ext.EventManager.useKeydown) {
										this.scope.fireKey(c)
									}
									return d
								}
								return true
							},
							forceKeyDown : true,
							defaultEventAction : "stopEvent"
						});
				this.queryDelay = Math.max(this.queryDelay || 10, this.mode == "local" ? 10 : 250);
				this.dqTask = new Ext.util.DelayedTask(this.initQuery, this);
				if (this.typeAhead) {
					this.taTask = new Ext.util.DelayedTask(this.onTypeAhead, this)
				}
				if (!this.enableKeyEvents) {
					this.mon(this.el, "keyup", this.onKeyUp, this)
				}
			},
			onDestroy : function () {
				if (this.dqTask) {
					this.dqTask.cancel();
					this.dqTask = null
				}
				this.bindStore(null);
				Ext.destroy(this.resizer, this.view, this.pageTb, this.list);
				Ext.destroyMembers(this, "hiddenField");
				Ext.form.ComboBox.superclass.onDestroy.call(this)
			},
			fireKey : function (a) {
				if (!this.isExpanded()) {
					Ext.form.ComboBox.superclass.fireKey.call(this, a)
				}
			},
			onResize : function (a, b) {
				Ext.form.ComboBox.superclass.onResize.apply(this, arguments);
				if (!isNaN(a) && this.isVisible() && this.list) {
					this.doResize(a)
				} else {
					this.bufferSize = a
				}
			},
			doResize : function (a) {
				if (!Ext.isDefined(this.listWidth)) {
					var b = Math.max(a, this.minListWidth);
					this.list.setWidth(b);
					this.innerList.setWidth(b - this.list.getFrameWidth("lr"))
				}
			},
			onEnable : function () {
				Ext.form.ComboBox.superclass.onEnable.apply(this, arguments);
				if (this.hiddenField) {
					this.hiddenField.disabled = false
				}
			},
			onDisable : function () {
				Ext.form.ComboBox.superclass.onDisable.apply(this, arguments);
				if (this.hiddenField) {
					this.hiddenField.disabled = true
				}
			},
			onBeforeLoad : function () {
				if (!this.hasFocus) {
					return
				}
				this.innerList.update(this.loadingText ? '<div class="loading-indicator">' + this.loadingText + "</div>" : "");
				this.restrictHeight();
				this.selectedIndex = -1
			},
			onLoad : function () {
				if (!this.hasFocus) {
					return
				}
				if (this.store.getCount() > 0 || this.listEmptyText) {
					this.expand();
					this.restrictHeight();
					if (this.lastQuery == this.allQuery) {
						if (this.editable) {
							this.el.dom.select()
						}
						if (this.autoSelect !== false && !this.selectByValue(this.value, true)) {
							this.select(0, true)
						}
					} else {
						if (this.autoSelect !== false) {
							this.selectNext()
						}
						if (this.typeAhead && this.lastKey != Ext.EventObject.BACKSPACE && this.lastKey != Ext.EventObject.DELETE) {
							this.taTask.delay(this.typeAheadDelay)
						}
					}
				} else {
					this.collapse()
				}
			},
			onTypeAhead : function () {
				if (this.store.getCount() > 0) {
					var b = this.store.getAt(0);
					var c = b.data[this.displayField];
					var a = c.length;
					var d = this.getRawValue().length;
					if (d != a) {
						this.setRawValue(c);
						this.selectText(d, c.length)
					}
				}
			},
			assertValue : function () {
				var b = this.getRawValue(),
				a;
				if (this.valueField && Ext.isDefined(this.value)) {
					a = this.findRecord(this.valueField, this.value)
				}
				if (!a || a.get(this.displayField) != b) {
					a = this.findRecord(this.displayField, b)
				}
				if (!a && this.forceSelection) {
					if (b.length > 0 && b != this.emptyText) {
						this.el.dom.value = Ext.value(this.lastSelectionText, "");
						this.applyEmptyText()
					} else {
						this.clearValue()
					}
				} else {
					if (a && this.valueField) {
						if (this.value == b) {
							return
						}
						b = a.get(this.valueField || this.displayField)
					}
					this.setValue(b)
				}
			},
			onSelect : function (a, b) {
				if (this.fireEvent("beforeselect", this, a, b) !== false) {
					this.setValue(a.data[this.valueField || this.displayField]);
					this.collapse();
					this.fireEvent("select", this, a, b)
				}
			},
			getName : function () {
				var a = this.hiddenField;
				return a && a.name ? a.name : this.hiddenName || Ext.form.ComboBox.superclass.getName.call(this)
			},
			getValue : function () {
				if (this.valueField) {
					return Ext.isDefined(this.value) ? this.value : ""
				} else {
					return Ext.form.ComboBox.superclass.getValue.call(this)
				}
			},
			clearValue : function () {
				if (this.hiddenField) {
					this.hiddenField.value = ""
				}
				this.setRawValue("");
				this.lastSelectionText = "";
				this.applyEmptyText();
				this.value = ""
			},
			setValue : function (a) {
				var c = a;
				if (this.valueField) {
					var b = this.findRecord(this.valueField, a);
					if (b) {
						c = b.data[this.displayField]
					} else {
						if (Ext.isDefined(this.valueNotFoundText)) {
							c = this.valueNotFoundText
						}
					}
				}
				this.lastSelectionText = c;
				if (this.hiddenField) {
					this.hiddenField.value = Ext.value(a, "")
				}
				Ext.form.ComboBox.superclass.setValue.call(this, c);
				this.value = a;
				return this
			},
			findRecord : function (c, b) {
				var a;
				if (this.store.getCount() > 0) {
					this.store.each(function (d) {
							if (d.data[c] == b) {
								a = d;
								return false
							}
						})
				}
				return a
			},
			onViewMove : function (b, a) {
				this.inKeyMode = false
			},
			onViewOver : function (d, b) {
				if (this.inKeyMode) {
					return
				}
				var c = this.view.findItemFromChild(b);
				if (c) {
					var a = this.view.indexOf(c);
					this.select(a, false)
				}
			},
			onViewClick : function (b) {
				var a = this.view.getSelectedIndexes()[0],
				c = this.store,
				d = c.getAt(a);
				if (d) {
					this.onSelect(d, a)
				} else {
					this.collapse()
				}
				if (b !== false) {
					this.el.focus()
				}
			},
			restrictHeight : function () {
				this.innerList.dom.style.height = "";
				var b = this.innerList.dom,
				e = this.list.getFrameWidth("tb") + (this.resizable ? this.handleHeight : 0) + this.assetHeight,
				c = Math.max(b.clientHeight, b.offsetHeight, b.scrollHeight),
				a = this.getPosition()[1] - Ext.getBody().getScroll().top,
				g = Ext.lib.Dom.getViewHeight() - a - this.getSize().height,
				d = Math.max(a, g, this.minHeight || 0) - this.list.shadowOffset - e - 5;
				c = Math.min(c, d, this.maxHeight);
				this.innerList.setHeight(c);
				this.list.beginUpdate();
				this.list.setHeight(c + e);
				this.list.alignTo.apply(this.list, [this.el].concat(this.listAlign));
				this.list.endUpdate()
			},
			isExpanded : function () {
				return this.list && this.list.isVisible()
			},
			selectByValue : function (a, c) {
				if (!Ext.isEmpty(a, true)) {
					var b = this.findRecord(this.valueField || this.displayField, a);
					if (b) {
						this.select(this.store.indexOf(b), c);
						return true
					}
				}
				return false
			},
			select : function (a, c) {
				this.selectedIndex = a;
				this.view.select(a);
				if (c !== false) {
					var b = this.view.getNode(a);
					if (b) {
						this.innerList.scrollChildIntoView(b, false)
					}
				}
			},
			selectNext : function () {
				var a = this.store.getCount();
				if (a > 0) {
					if (this.selectedIndex == -1) {
						this.select(0)
					} else {
						if (this.selectedIndex < a - 1) {
							this.select(this.selectedIndex + 1)
						}
					}
				}
			},
			selectPrev : function () {
				var a = this.store.getCount();
				if (a > 0) {
					if (this.selectedIndex == -1) {
						this.select(0)
					} else {
						if (this.selectedIndex !== 0) {
							this.select(this.selectedIndex - 1)
						}
					}
				}
			},
			onKeyUp : function (b) {
				var a = b.getKey();
				if (this.editable !== false && this.readOnly !== true && (a == b.BACKSPACE || !b.isSpecialKey())) {
					this.lastKey = a;
					this.dqTask.delay(this.queryDelay)
				}
				Ext.form.ComboBox.superclass.onKeyUp.call(this, b)
			},
			validateBlur : function () {
				return !this.list || !this.list.isVisible()
			},
			initQuery : function () {
				this.doQuery(this.getRawValue())
			},
			beforeBlur : function () {
				this.assertValue()
			},
			postBlur : function () {
				Ext.form.ComboBox.superclass.postBlur.call(this);
				this.collapse();
				this.inKeyMode = false
			},
			doQuery : function (c, b) {
				c = Ext.isEmpty(c) ? "" : c;
				var a = {
					query : c,
					forceAll : b,
					combo : this,
					cancel : false
				};
				if (this.fireEvent("beforequery", a) === false || a.cancel) {
					return false
				}
				c = a.query;
				b = a.forceAll;
				if (b === true || (c.length >= this.minChars)) {
					if (this.lastQuery !== c) {
						this.lastQuery = c;
						if (this.mode == "local") {
							this.selectedIndex = -1;
							if (b) {
								this.store.clearFilter()
							} else {
								this.store.filter(this.displayField, c)
							}
							this.onLoad()
						} else {
							this.store.baseParams[this.queryParam] = c;
							this.store.load({
									params : this.getParams(c)
								});
							this.expand()
						}
					} else {
						this.selectedIndex = -1;
						this.onLoad()
					}
				}
			},
			getParams : function (a) {
				var b = {},
				c = this.store.paramNames;
				if (this.pageSize) {
					b[c.start] = 0;
					b[c.limit] = this.pageSize
				}
				return b
			},
			collapse : function () {
				if (!this.isExpanded()) {
					return
				}
				this.list.hide();
				Ext.getDoc().un("mousewheel", this.collapseIf, this);
				Ext.getDoc().un("mousedown", this.collapseIf, this);
				this.fireEvent("collapse", this)
			},
			collapseIf : function (a) {
				if (!this.isDestroyed && !a.within(this.wrap) && !a.within(this.list)) {
					this.collapse()
				}
			},
			expand : function () {
				if (this.isExpanded() || !this.hasFocus) {
					return
				}
				if (this.title || this.pageSize) {
					this.assetHeight = 0;
					if (this.title) {
						this.assetHeight += this.header.getHeight()
					}
					if (this.pageSize) {
						this.assetHeight += this.footer.getHeight()
					}
				}
				if (this.bufferSize) {
					this.doResize(this.bufferSize);
					delete this.bufferSize
				}
				this.list.alignTo.apply(this.list, [this.el].concat(this.listAlign));
				this.list.setZIndex(this.getZIndex());
				this.list.show();
				if (Ext.isGecko2) {
					this.innerList.setOverflow("auto")
				}
				this.mon(Ext.getDoc(), {
						scope : this,
						mousewheel : this.collapseIf,
						mousedown : this.collapseIf
					});
				this.fireEvent("expand", this)
			},
			onTriggerClick : function () {
				if (this.readOnly || this.disabled) {
					return
				}
				if (this.isExpanded()) {
					this.collapse();
					this.el.focus()
				} else {
					this.onFocus({});
					if (this.triggerAction == "all") {
						this.doQuery(this.allQuery, true)
					} else {
						this.doQuery(this.getRawValue())
					}
					this.el.focus()
				}
			}
		});
Ext.reg("combo", Ext.form.ComboBox);
Ext.form.Checkbox = Ext.extend(Ext.form.Field, {
			focusClass : undefined,
			fieldClass : "x-form-field",
			checked : false,
			boxLabel : "&#160;",
			defaultAutoCreate : {
				tag : "input",
				type : "checkbox",
				autocomplete : "off"
			},
			actionMode : "wrap",
			initComponent : function () {
				Ext.form.Checkbox.superclass.initComponent.call(this);
				this.addEvents("check")
			},
			onResize : function () {
				Ext.form.Checkbox.superclass.onResize.apply(this, arguments);
				if (!this.boxLabel && !this.fieldLabel) {
					this.el.alignTo(this.wrap, "c-c")
				}
			},
			initEvents : function () {
				Ext.form.Checkbox.superclass.initEvents.call(this);
				this.mon(this.el, {
						scope : this,
						click : this.onClick,
						change : this.onClick
					})
			},
			markInvalid : Ext.emptyFn,
			clearInvalid : Ext.emptyFn,
			onRender : function (b, a) {
				Ext.form.Checkbox.superclass.onRender.call(this, b, a);
				if (this.inputValue !== undefined) {
					this.el.dom.value = this.inputValue
				}
				this.wrap = this.el.wrap({
							cls : "x-form-check-wrap"
						});
				if (this.boxLabel) {
					this.wrap.createChild({
							tag : "label",
							htmlFor : this.el.id,
							cls : "x-form-cb-label",
							html : this.boxLabel
						})
				}
				if (this.checked) {
					this.setValue(true)
				} else {
					this.checked = this.el.dom.checked
				}
				if (Ext.isIE && !Ext.isStrict) {
					this.wrap.repaint()
				}
				this.resizeEl = this.positionEl = this.wrap
			},
			onDestroy : function () {
				Ext.destroy(this.wrap);
				Ext.form.Checkbox.superclass.onDestroy.call(this)
			},
			initValue : function () {
				this.originalValue = this.getValue()
			},
			getValue : function () {
				if (this.rendered) {
					return this.el.dom.checked
				}
				return this.checked
			},
			onClick : function () {
				if (this.el.dom.checked != this.checked) {
					this.setValue(this.el.dom.checked)
				}
			},
			setValue : function (a) {
				var c = this.checked,
				b = this.inputValue;
				if (a === false) {
					this.checked = false
				} else {
					this.checked = (a === true || a === "true" || a == "1" || (b ? a == b : String(a).toLowerCase() == "on"))
				}
				if (this.rendered) {
					this.el.dom.checked = this.checked;
					this.el.dom.defaultChecked = this.checked
				}
				if (c != this.checked) {
					this.fireEvent("check", this, this.checked);
					if (this.handler) {
						this.handler.call(this.scope || this, this, this.checked)
					}
				}
				return this
			}
		});
Ext.reg("checkbox", Ext.form.Checkbox);
Ext.form.CheckboxGroup = Ext.extend(Ext.form.Field, {
			columns : "auto",
			vertical : false,
			allowBlank : true,
			blankText : "You must select at least one item in this group",
			defaultType : "checkbox",
			groupCls : "x-form-check-group",
			initComponent : function () {
				this.addEvents("change");
				this.on("change", this.validate, this);
				Ext.form.CheckboxGroup.superclass.initComponent.call(this)
			},
			onRender : function (j, g) {
				if (!this.el) {
					var p = {
						autoEl : {
							id : this.id
						},
						cls : this.groupCls,
						layout : "column",
						renderTo : j,
						bufferResize : false
					};
					var a = {
						xtype : "container",
						defaultType : this.defaultType,
						layout : "form",
						defaults : {
							hideLabel : true,
							anchor : "100%"
						}
					};
					if (this.items[0].items) {
						Ext.apply(p, {
								layoutConfig : {
									columns : this.items.length
								},
								defaults : this.defaults,
								items : this.items
							});
						for (var e = 0, m = this.items.length; e < m; e++) {
							Ext.applyIf(this.items[e], a)
						}
					} else {
						var d,
						n = [];
						if (typeof this.columns == "string") {
							this.columns = this.items.length
						}
						if (!Ext.isArray(this.columns)) {
							var k = [];
							for (var e = 0; e < this.columns; e++) {
								k.push((100 / this.columns) * 0.01)
							}
							this.columns = k
						}
						d = this.columns.length;
						for (var e = 0; e < d; e++) {
							var b = Ext.apply({
										items : []
									}, a);
							b[this.columns[e] <= 1 ? "columnWidth" : "width"] = this.columns[e];
							if (this.defaults) {
								b.defaults = Ext.apply(b.defaults || {}, this.defaults)
							}
							n.push(b)
						}
						if (this.vertical) {
							var r = Math.ceil(this.items.length / d),
							o = 0;
							for (var e = 0, m = this.items.length; e < m; e++) {
								if (e > 0 && e % r == 0) {
									o++
								}
								if (this.items[e].fieldLabel) {
									this.items[e].hideLabel = false
								}
								n[o].items.push(this.items[e])
							}
						} else {
							for (var e = 0, m = this.items.length; e < m; e++) {
								var q = e % d;
								if (this.items[e].fieldLabel) {
									this.items[e].hideLabel = false
								}
								n[q].items.push(this.items[e])
							}
						}
						Ext.apply(p, {
								layoutConfig : {
									columns : d
								},
								items : n
							})
					}
					this.panel = new Ext.Container(p);
					this.panel.ownerCt = this;
					this.el = this.panel.getEl();
					if (this.forId && this.itemCls) {
						var c = this.el.up(this.itemCls).child("label", true);
						if (c) {
							c.setAttribute("htmlFor", this.forId)
						}
					}
					var h = this.panel.findBy(function (i) {
								return i.isFormField
							}, this);
					this.items = new Ext.util.MixedCollection();
					this.items.addAll(h)
				}
				Ext.form.CheckboxGroup.superclass.onRender.call(this, j, g)
			},
			initValue : function () {
				if (this.value) {
					this.setValue.apply(this, this.buffered ? this.value : [this.value]);
					delete this.buffered;
					delete this.value
				}
			},
			afterRender : function () {
				Ext.form.CheckboxGroup.superclass.afterRender.call(this);
				this.eachItem(function (a) {
						a.on("check", this.fireChecked, this);
						a.inGroup = true
					})
			},
			doLayout : function () {
				if (this.rendered) {
					this.panel.forceLayout = this.ownerCt.forceLayout;
					this.panel.doLayout()
				}
			},
			fireChecked : function () {
				var a = [];
				this.eachItem(function (b) {
						if (b.checked) {
							a.push(b)
						}
					});
				this.fireEvent("change", this, a)
			},
			getErrors : function () {
				var b = Ext.form.CheckboxGroup.superclass.getErrors.apply(this, arguments);
				if (!this.allowBlank) {
					var a = true;
					this.eachItem(function (c) {
							if (c.checked) {
								return (a = false)
							}
						});
					if (a) {
						b.push(this.blankText)
					}
				}
				return b
			},
			isDirty : function () {
				if (this.disabled || !this.rendered) {
					return false
				}
				var a = false;
				this.eachItem(function (b) {
						if (b.isDirty()) {
							a = true;
							return false
						}
					});
				return a
			},
			setReadOnly : function (a) {
				if (this.rendered) {
					this.eachItem(function (b) {
							b.setReadOnly(a)
						})
				}
				this.readOnly = a
			},
			onDisable : function () {
				this.eachItem(function (a) {
						a.disable()
					})
			},
			onEnable : function () {
				this.eachItem(function (a) {
						a.enable()
					})
			},
			onResize : function (a, b) {
				this.panel.setSize(a, b);
				this.panel.doLayout()
			},
			reset : function () {
				if (this.originalValue) {
					this.eachItem(function (a) {
							if (a.setValue) {
								a.setValue(false);
								a.originalValue = a.getValue()
							}
						});
					this.resetOriginal = true;
					this.setValue(this.originalValue);
					delete this.resetOriginal
				} else {
					this.eachItem(function (a) {
							if (a.reset) {
								a.reset()
							}
						})
				}
				(function () {
						this.clearInvalid()
					}).defer(50, this)
			},
			setValue : function () {
				if (this.rendered) {
					this.onSetValue.apply(this, arguments)
				} else {
					this.buffered = true;
					this.value = arguments
				}
				return this
			},
			onSetValue : function (d, c) {
				if (arguments.length == 1) {
					if (Ext.isArray(d)) {
						Ext.each(d, function (h, e) {
								if (Ext.isObject(h) && h.setValue) {
									h.setValue(true);
									if (this.resetOriginal === true) {
										h.originalValue = h.getValue()
									}
								} else {
									var g = this.items.itemAt(e);
									if (g) {
										g.setValue(h)
									}
								}
							}, this)
					} else {
						if (Ext.isObject(d)) {
							for (var a in d) {
								var b = this.getBox(a);
								if (b) {
									b.setValue(d[a])
								}
							}
						} else {
							this.setValueForItem(d)
						}
					}
				} else {
					var b = this.getBox(d);
					if (b) {
						b.setValue(c)
					}
				}
			},
			beforeDestroy : function () {
				Ext.destroy(this.panel);
				if (!this.rendered) {
					Ext.destroy(this.items)
				}
				Ext.form.CheckboxGroup.superclass.beforeDestroy.call(this)
			},
			setValueForItem : function (a) {
				a = String(a).split(",");
				this.eachItem(function (b) {
						if (a.indexOf(b.inputValue) > -1) {
							b.setValue(true)
						}
					})
			},
			getBox : function (b) {
				var a = null;
				this.eachItem(function (c) {
						if (b == c || c.dataIndex == b || c.id == b || c.getName() == b) {
							a = c;
							return false
						}
					});
				return a
			},
			getValue : function () {
				var a = [];
				this.eachItem(function (b) {
						if (b.checked) {
							a.push(b)
						}
					});
				return a
			},
			eachItem : function (b, a) {
				if (this.items && this.items.each) {
					this.items.each(b, a || this)
				}
			},
			getRawValue : Ext.emptyFn,
			setRawValue : Ext.emptyFn
		});
Ext.reg("checkboxgroup", Ext.form.CheckboxGroup);
Ext.form.CompositeField = Ext.extend(Ext.form.Field, {
			defaultMargins : "0 5 0 0",
			skipLastItemMargin : true,
			isComposite : true,
			combineErrors : true,
			labelConnector : ", ",
			initComponent : function () {
				var g = [],
				b = this.items,
				e;
				for (var d = 0, c = b.length; d < c; d++) {
					e = b[d];
					if (!Ext.isEmpty(e.ref)) {
						e.ref = "../" + e.ref
					}
					g.push(e.fieldLabel);
					Ext.applyIf(e, this.defaults);
					if (!(d == c - 1 && this.skipLastItemMargin)) {
						Ext.applyIf(e, {
								margins : this.defaultMargins
							})
					}
				}
				this.fieldLabel = this.fieldLabel || this.buildLabel(g);
				this.fieldErrors = new Ext.util.MixedCollection(true, function (h) {
							return h.field
						});
				this.fieldErrors.on({
						scope : this,
						add : this.updateInvalidMark,
						remove : this.updateInvalidMark,
						replace : this.updateInvalidMark
					});
				Ext.form.CompositeField.superclass.initComponent.apply(this, arguments);
				this.innerCt = new Ext.Container({
							layout : "hbox",
							items : this.items,
							cls : "x-form-composite",
							defaultMargins : "0 3 0 0",
							ownerCt : this
						});
				this.innerCt.ownerCt = undefined;
				var a = this.innerCt.findBy(function (h) {
							return h.isFormField
						}, this);
				this.items = new Ext.util.MixedCollection();
				this.items.addAll(a)
			},
			onRender : function (c, a) {
				if (!this.el) {
					var d = this.innerCt;
					d.render(c);
					this.el = d.getEl();
					if (this.combineErrors) {
						this.eachItem(function (e) {
								Ext.apply(e, {
										markInvalid : this.onFieldMarkInvalid.createDelegate(this, [e], 0),
										clearInvalid : this.onFieldClearInvalid.createDelegate(this, [e], 0)
									})
							})
					}
					var b = this.el.parent().parent().child("label", true);
					if (b) {
						b.setAttribute("for", this.items.items[0].id)
					}
				}
				Ext.form.CompositeField.superclass.onRender.apply(this, arguments)
			},
			onFieldMarkInvalid : function (d, c) {
				var b = d.getName(),
				a = {
					field : b,
					errorName : d.fieldLabel || b,
					error : c
				};
				this.fieldErrors.replace(b, a);
				if (!d.preventMark) {
					d.el.addClass(d.invalidClass)
				}
			},
			onFieldClearInvalid : function (a) {
				this.fieldErrors.removeKey(a.getName());
				a.el.removeClass(a.invalidClass)
			},
			updateInvalidMark : function () {
				var a = Ext.isIE6 && Ext.isStrict;
				if (this.fieldErrors.length == 0) {
					this.clearInvalid();
					if (a) {
						this.clearInvalid.defer(50, this)
					}
				} else {
					var b = this.buildCombinedErrorMessage(this.fieldErrors.items);
					this.sortErrors();
					this.markInvalid(b);
					if (a) {
						this.markInvalid(b)
					}
				}
			},
			validateValue : function (c, a) {
				var b = true;
				this.eachItem(function (d) {
						if (!d.isValid(a)) {
							b = false
						}
					});
				return b
			},
			buildCombinedErrorMessage : function (e) {
				var d = [],
				b;
				for (var c = 0, a = e.length; c < a; c++) {
					b = e[c];
					d.push(String.format("{0}: {1}", b.errorName, b.error))
				}
				return d.join("<br />")
			},
			sortErrors : function () {
				var a = this.items;
				this.fieldErrors.sort("ASC", function (g, d) {
						var c = function (b) {
							return function (i) {
								return i.getName() == b
							}
						};
						var h = a.findIndexBy(c(g.field)),
						e = a.findIndexBy(c(d.field));
						return h < e ? -1 : 1
					})
			},
			reset : function () {
				this.eachItem(function (a) {
						a.reset()
					});
				(function () {
						this.clearInvalid()
					}).defer(50, this)
			},
			clearInvalidChildren : function () {
				this.eachItem(function (a) {
						a.clearInvalid()
					})
			},
			buildLabel : function (a) {
				return Ext.clean(a).join(this.labelConnector)
			},
			isDirty : function () {
				if (this.disabled || !this.rendered) {
					return false
				}
				var a = false;
				this.eachItem(function (b) {
						if (b.isDirty()) {
							a = true;
							return false
						}
					});
				return a
			},
			eachItem : function (b, a) {
				if (this.items && this.items.each) {
					this.items.each(b, a || this)
				}
			},
			onResize : function (e, c, a, d) {
				var b = this.innerCt;
				if (this.rendered && b.rendered) {
					b.setSize(e, c)
				}
				Ext.form.CompositeField.superclass.onResize.apply(this, arguments)
			},
			doLayout : function (c, b) {
				if (this.rendered) {
					var a = this.innerCt;
					a.forceLayout = this.ownerCt.forceLayout;
					a.doLayout(c, b)
				}
			},
			beforeDestroy : function () {
				Ext.destroy(this.innerCt);
				Ext.form.CompositeField.superclass.beforeDestroy.call(this)
			},
			setReadOnly : function (a) {
				if (a == undefined) {
					a = true
				}
				a = !!a;
				if (this.rendered) {
					this.eachItem(function (b) {
							b.setReadOnly(a)
						})
				}
				this.readOnly = a
			},
			onShow : function () {
				Ext.form.CompositeField.superclass.onShow.call(this);
				this.doLayout()
			},
			onDisable : function () {
				this.eachItem(function (a) {
						a.disable()
					})
			},
			onEnable : function () {
				this.eachItem(function (a) {
						a.enable()
					})
			}
		});
Ext.reg("compositefield", Ext.form.CompositeField);
Ext.form.Radio = Ext.extend(Ext.form.Checkbox, {
			inputType : "radio",
			markInvalid : Ext.emptyFn,
			clearInvalid : Ext.emptyFn,
			getGroupValue : function () {
				var a = this.el.up("form") || Ext.getBody();
				var b = a.child('input[name="' + this.el.dom.name + '"]:checked', true);
				return b ? b.value : null
			},
			setValue : function (b) {
				var a,
				d,
				c;
				if (typeof b == "boolean") {
					Ext.form.Radio.superclass.setValue.call(this, b)
				} else {
					if (this.rendered) {
						a = this.getCheckEl();
						c = a.child('input[name="' + this.el.dom.name + '"][value="' + b + '"]', true);
						if (c) {
							Ext.getCmp(c.id).setValue(true)
						}
					}
				}
				if (this.rendered && this.checked) {
					a = a || this.getCheckEl();
					d = this.getCheckEl().select('input[name="' + this.el.dom.name + '"]');
					d.each(function (e) {
							if (e.dom.id != this.id) {
								Ext.getCmp(e.dom.id).setValue(false)
							}
						}, this)
				}
				return this
			},
			getCheckEl : function () {
				if (this.inGroup) {
					return this.el.up(".x-form-radio-group")
				}
				return this.el.up("form") || Ext.getBody()
			}
		});
Ext.reg("radio", Ext.form.Radio);
Ext.form.RadioGroup = Ext.extend(Ext.form.CheckboxGroup, {
			allowBlank : true,
			blankText : "You must select one item in this group",
			defaultType : "radio",
			groupCls : "x-form-radio-group",
			getValue : function () {
				var a = null;
				this.eachItem(function (b) {
						if (b.checked) {
							a = b;
							return false
						}
					});
				return a
			},
			onSetValue : function (c, b) {
				if (arguments.length > 1) {
					var a = this.getBox(c);
					if (a) {
						a.setValue(b);
						if (a.checked) {
							this.eachItem(function (d) {
									if (d !== a) {
										d.setValue(false)
									}
								})
						}
					}
				} else {
					this.setValueForItem(c)
				}
			},
			setValueForItem : function (a) {
				a = String(a).split(",")[0];
				this.eachItem(function (b) {
						b.setValue(a == b.inputValue)
					})
			},
			fireChecked : function () {
				if (!this.checkTask) {
					this.checkTask = new Ext.util.DelayedTask(this.bufferChecked, this)
				}
				this.checkTask.delay(10)
			},
			bufferChecked : function () {
				var a = null;
				this.eachItem(function (b) {
						if (b.checked) {
							a = b;
							return false
						}
					});
				this.fireEvent("change", this, a)
			},
			onDestroy : function () {
				if (this.checkTask) {
					this.checkTask.cancel();
					this.checkTask = null
				}
				Ext.form.RadioGroup.superclass.onDestroy.call(this)
			}
		});
Ext.reg("radiogroup", Ext.form.RadioGroup);
Ext.form.Hidden = Ext.extend(Ext.form.Field, {
			inputType : "hidden",
			shouldLayout : false,
			onRender : function () {
				Ext.form.Hidden.superclass.onRender.apply(this, arguments)
			},
			initEvents : function () {
				this.originalValue = this.getValue()
			},
			setSize : Ext.emptyFn,
			setWidth : Ext.emptyFn,
			setHeight : Ext.emptyFn,
			setPosition : Ext.emptyFn,
			setPagePosition : Ext.emptyFn,
			markInvalid : Ext.emptyFn,
			clearInvalid : Ext.emptyFn
		});
Ext.reg("hidden", Ext.form.Hidden);
Ext.form.BasicForm = Ext.extend(Ext.util.Observable, {
			constructor : function (b, a) {
				Ext.apply(this, a);
				if (Ext.isString(this.paramOrder)) {
					this.paramOrder = this.paramOrder.split(/[\s,|]/)
				}
				this.items = new Ext.util.MixedCollection(false, function (c) {
							return c.getItemId()
						});
				this.addEvents("beforeaction", "actionfailed", "actioncomplete");
				if (b) {
					this.initEl(b)
				}
				Ext.form.BasicForm.superclass.constructor.call(this)
			},
			timeout : 30,
			paramOrder : undefined,
			paramsAsHash : false,
			waitTitle : "Please Wait...",
			activeAction : null,
			trackResetOnLoad : false,
			initEl : function (a) {
				this.el = Ext.get(a);
				this.id = this.el.id || Ext.id();
				if (!this.standardSubmit) {
					this.el.on("submit", this.onSubmit, this)
				}
				this.el.addClass("x-form")
			},
			getEl : function () {
				return this.el
			},
			onSubmit : function (a) {
				a.stopEvent()
			},
			destroy : function (a) {
				if (a !== true) {
					this.items.each(function (b) {
							Ext.destroy(b)
						});
					Ext.destroy(this.el)
				}
				this.items.clear();
				this.purgeListeners()
			},
			isValid : function () {
				var a = true;
				this.items.each(function (b) {
						if (!b.validate()) {
							a = false
						}
					});
				return a
			},
			isDirty : function () {
				var a = false;
				this.items.each(function (b) {
						if (b.isDirty()) {
							a = true;
							return false
						}
					});
				return a
			},
			doAction : function (b, a) {
				if (Ext.isString(b)) {
					b = new Ext.form.Action.ACTION_TYPES[b](this, a)
				}
				if (this.fireEvent("beforeaction", this, b) !== false) {
					this.beforeAction(b);
					b.run.defer(100, b)
				}
				return this
			},
			submit : function (b) {
				b = b || {};
				if (this.standardSubmit) {
					var a = b.clientValidation === false || this.isValid();
					if (a) {
						var c = this.el.dom;
						if (this.url && Ext.isEmpty(c.action)) {
							c.action = this.url
						}
						c.submit()
					}
					return a
				}
				var d = String.format("{0}submit", this.api ? "direct" : "");
				this.doAction(d, b);
				return this
			},
			load : function (a) {
				var b = String.format("{0}load", this.api ? "direct" : "");
				this.doAction(b, a);
				return this
			},
			updateRecord : function (b) {
				b.beginEdit();
				var a = b.fields,
				d,
				c;
				a.each(function (e) {
						d = this.findField(e.name);
						if (d) {
							c = d.getValue();
							if (Ext.type(c) !== false && c.getGroupValue) {
								c = c.getGroupValue()
							} else {
								if (d.eachItem) {
									c = [];
									d.eachItem(function (g) {
											c.push(g.getValue())
										})
								}
							}
							b.set(e.name, c)
						}
					}, this);
				b.endEdit();
				return this
			},
			loadRecord : function (a) {
				this.setValues(a.data);
				return this
			},
			beforeAction : function (a) {
				this.items.each(function (c) {
						if (c.isFormField && c.syncValue) {
							c.syncValue()
						}
					});
				var b = a.options;
				if (b.waitMsg) {
					if (this.waitMsgTarget === true) {
						this.el.mask(b.waitMsg, "x-mask-loading")
					} else {
						if (this.waitMsgTarget) {
							this.waitMsgTarget = Ext.get(this.waitMsgTarget);
							this.waitMsgTarget.mask(b.waitMsg, "x-mask-loading")
						} else {
							Ext.MessageBox.wait(b.waitMsg, b.waitTitle || this.waitTitle)
						}
					}
				}
			},
			afterAction : function (a, c) {
				this.activeAction = null;
				var b = a.options;
				if (b.waitMsg) {
					if (this.waitMsgTarget === true) {
						this.el.unmask()
					} else {
						if (this.waitMsgTarget) {
							this.waitMsgTarget.unmask()
						} else {
							Ext.MessageBox.updateProgress(1);
							Ext.MessageBox.hide()
						}
					}
				}
				if (c) {
					if (b.reset) {
						this.reset()
					}
					Ext.callback(b.success, b.scope, [this, a]);
					this.fireEvent("actioncomplete", this, a)
				} else {
					Ext.callback(b.failure, b.scope, [this, a]);
					this.fireEvent("actionfailed", this, a)
				}
			},
			findField : function (c) {
				var b = this.items.get(c);
				if (!Ext.isObject(b)) {
					var a = function (d) {
						if (d.isFormField) {
							if (d.dataIndex == c || d.id == c || d.getName() == c) {
								b = d;
								return false
							} else {
								if (d.isComposite) {
									return d.items.each(a)
								} else {
									if (d instanceof Ext.form.CheckboxGroup && d.rendered) {
										return d.eachItem(a)
									}
								}
							}
						}
					};
					this.items.each(a)
				}
				return b || null
			},
			markInvalid : function (h) {
				if (Ext.isArray(h)) {
					for (var c = 0, a = h.length; c < a; c++) {
						var b = h[c];
						var d = this.findField(b.id);
						if (d) {
							d.markInvalid(b.msg)
						}
					}
				} else {
					var e,
					g;
					for (g in h) {
						if (!Ext.isFunction(h[g]) && (e = this.findField(g))) {
							e.markInvalid(h[g])
						}
					}
				}
				return this
			},
			setValues : function (c) {
				if (Ext.isArray(c)) {
					for (var d = 0, a = c.length; d < a; d++) {
						var b = c[d];
						var e = this.findField(b.id);
						if (e) {
							e.setValue(b.value);
							if (this.trackResetOnLoad) {
								e.originalValue = e.getValue()
							}
						}
					}
				} else {
					var g,
					h;
					for (h in c) {
						if (!Ext.isFunction(c[h]) && (g = this.findField(h))) {
							g.setValue(c[h]);
							if (this.trackResetOnLoad) {
								g.originalValue = g.getValue()
							}
						}
					}
				}
				return this
			},
			getValues : function (b) {
				var a = Ext.lib.Ajax.serializeForm(this.el.dom);
				if (b === true) {
					return a
				}
				return Ext.urlDecode(a)
			},
			getFieldValues : function (a) {
				var d = {},
				e,
				b,
				c;
				this.items.each(function (g) {
						if (!g.disabled && (a !== true || g.isDirty())) {
							e = g.getName();
							b = d[e];
							c = g.getValue();
							if (Ext.isDefined(b)) {
								if (Ext.isArray(b)) {
									d[e].push(c)
								} else {
									d[e] = [b, c]
								}
							} else {
								d[e] = c
							}
						}
					});
				return d
			},
			clearInvalid : function () {
				this.items.each(function (a) {
						a.clearInvalid()
					});
				return this
			},
			reset : function () {
				this.items.each(function (a) {
						a.reset()
					});
				return this
			},
			add : function () {
				this.items.addAll(Array.prototype.slice.call(arguments, 0));
				return this
			},
			remove : function (a) {
				this.items.remove(a);
				return this
			},
			cleanDestroyed : function () {
				this.items.filterBy(function (a) {
						return !!a.isDestroyed
					}).each(this.remove, this)
			},
			render : function () {
				this.items.each(function (a) {
						if (a.isFormField && !a.rendered && document.getElementById(a.id)) {
							a.applyToMarkup(a.id)
						}
					});
				return this
			},
			applyToFields : function (a) {
				this.items.each(function (b) {
						Ext.apply(b, a)
					});
				return this
			},
			applyIfToFields : function (a) {
				this.items.each(function (b) {
						Ext.applyIf(b, a)
					});
				return this
			},
			callFieldMethod : function (b, a) {
				a = a || [];
				this.items.each(function (c) {
						if (Ext.isFunction(c[b])) {
							c[b].apply(c, a)
						}
					});
				return this
			}
		});
Ext.BasicForm = Ext.form.BasicForm;
Ext.FormPanel = Ext.extend(Ext.Panel, {
			minButtonWidth : 75,
			labelAlign : "left",
			monitorValid : false,
			monitorPoll : 200,
			layout : "form",
			initComponent : function () {
				this.form = this.createForm();
				Ext.FormPanel.superclass.initComponent.call(this);
				this.bodyCfg = {
					tag : "form",
					cls : this.baseCls + "-body",
					method : this.method || "POST",
					id : this.formId || Ext.id()
				};
				if (this.fileUpload) {
					this.bodyCfg.enctype = "multipart/form-data"
				}
				this.initItems();
				this.addEvents("clientvalidation");
				this.relayEvents(this.form, ["beforeaction", "actionfailed", "actioncomplete"])
			},
			createForm : function () {
				var a = Ext.applyIf({
							listeners : {}
							
						}, this.initialConfig);
				return new Ext.form.BasicForm(null, a)
			},
			initFields : function () {
				var c = this.form;
				var a = this;
				var b = function (d) {
					if (a.isField(d)) {
						c.add(d)
					} else {
						if (d.findBy && d != a) {
							a.applySettings(d);
							if (d.items && d.items.each) {
								d.items.each(b, this)
							}
						}
					}
				};
				this.items.each(b, this)
			},
			applySettings : function (b) {
				var a = b.ownerCt;
				Ext.applyIf(b, {
						labelAlign : a.labelAlign,
						labelWidth : a.labelWidth,
						itemCls : a.itemCls
					})
			},
			getLayoutTarget : function () {
				return this.form.el
			},
			getForm : function () {
				return this.form
			},
			onRender : function (b, a) {
				this.initFields();
				Ext.FormPanel.superclass.onRender.call(this, b, a);
				this.form.initEl(this.body)
			},
			beforeDestroy : function () {
				this.stopMonitoring();
				this.form.destroy(true);
				Ext.FormPanel.superclass.beforeDestroy.call(this)
			},
			isField : function (a) {
				return !!a.setValue && !!a.getValue && !!a.markInvalid && !!a.clearInvalid
			},
			initEvents : function () {
				Ext.FormPanel.superclass.initEvents.call(this);
				this.on({
						scope : this,
						add : this.onAddEvent,
						remove : this.onRemoveEvent
					});
				if (this.monitorValid) {
					this.startMonitoring()
				}
			},
			onAdd : function (a) {
				Ext.FormPanel.superclass.onAdd.call(this, a);
				this.processAdd(a)
			},
			onAddEvent : function (a, b) {
				if (a !== this) {
					this.processAdd(b)
				}
			},
			processAdd : function (a) {
				if (this.isField(a)) {
					this.form.add(a)
				} else {
					if (a.findBy) {
						this.applySettings(a);
						this.form.add.apply(this.form, a.findBy(this.isField))
					}
				}
			},
			onRemove : function (a) {
				Ext.FormPanel.superclass.onRemove.call(this, a);
				this.processRemove(a)
			},
			onRemoveEvent : function (a, b) {
				if (a !== this) {
					this.processRemove(b)
				}
			},
			processRemove : function (a) {
				if (!this.destroying) {
					if (this.isField(a)) {
						this.form.remove(a)
					} else {
						if (a.findBy) {
							Ext.each(a.findBy(this.isField), this.form.remove, this.form);
							this.form.cleanDestroyed()
						}
					}
				}
			},
			startMonitoring : function () {
				if (!this.validTask) {
					this.validTask = new Ext.util.TaskRunner();
					this.validTask.start({
							run : this.bindHandler,
							interval : this.monitorPoll || 200,
							scope : this
						})
				}
			},
			stopMonitoring : function () {
				if (this.validTask) {
					this.validTask.stopAll();
					this.validTask = null
				}
			},
			load : function () {
				this.form.load.apply(this.form, arguments)
			},
			onDisable : function () {
				Ext.FormPanel.superclass.onDisable.call(this);
				if (this.form) {
					this.form.items.each(function () {
							this.disable()
						})
				}
			},
			onEnable : function () {
				Ext.FormPanel.superclass.onEnable.call(this);
				if (this.form) {
					this.form.items.each(function () {
							this.enable()
						})
				}
			},
			bindHandler : function () {
				var e = true;
				this.form.items.each(function (g) {
						if (!g.isValid(true)) {
							e = false;
							return false
						}
					});
				if (this.fbar) {
					var b = this.fbar.items.items;
					for (var d = 0, a = b.length; d < a; d++) {
						var c = b[d];
						if (c.formBind === true && c.disabled === e) {
							c.setDisabled(!e)
						}
					}
				}
				this.fireEvent("clientvalidation", this, e)
			}
		});
Ext.reg("form", Ext.FormPanel);
Ext.form.FormPanel = Ext.FormPanel;
Ext.form.FieldSet = Ext.extend(Ext.Panel, {
			baseCls : "x-fieldset",
			layout : "form",
			animCollapse : false,
			onRender : function (b, a) {
				if (!this.el) {
					this.el = document.createElement("fieldset");
					this.el.id = this.id;
					if (this.title || this.header || this.checkboxToggle) {
						this.el.appendChild(document.createElement("legend")).className = this.baseCls + "-header"
					}
				}
				Ext.form.FieldSet.superclass.onRender.call(this, b, a);
				if (this.checkboxToggle) {
					var c = typeof this.checkboxToggle == "object" ? this.checkboxToggle : {
							tag : "input",
							type : "checkbox",
							name : this.checkboxName || this.id + "-checkbox"
						};
					this.checkbox = this.header.insertFirst(c);
					this.checkbox.dom.checked = !this.collapsed;
					this.mon(this.checkbox, "click", this.onCheckClick, this)
				}
			},
			onCollapse : function (a, b) {
				if (this.checkbox) {
					this.checkbox.dom.checked = false
				}
				Ext.form.FieldSet.superclass.onCollapse.call(this, a, b)
			},
			onExpand : function (a, b) {
				if (this.checkbox) {
					this.checkbox.dom.checked = true
				}
				Ext.form.FieldSet.superclass.onExpand.call(this, a, b)
			},
			onCheckClick : function () {
				this[this.checkbox.dom.checked ? "expand" : "collapse"]()
			}
		});
Ext.reg("fieldset", Ext.form.FieldSet);
Ext.form.HtmlEditor = Ext.extend(Ext.form.Field, {
			enableFormat : true,
			enableFontSize : true,
			enableColors : true,
			enableAlignments : true,
			enableLists : true,
			enableSourceEdit : true,
			enableLinks : true,
			enableFont : true,
			createLinkText : "Please enter the URL for the link:",
			defaultLinkValue : "http://",
			fontFamilies : ["Arial", "Courier New", "Tahoma", "Times New Roman", "Verdana"],
			defaultFont : "tahoma",
			defaultValue : (Ext.isOpera || Ext.isIE6) ? "&#160;" : "&#8203;",
			actionMode : "wrap",
			validationEvent : false,
			deferHeight : true,
			initialized : false,
			activated : false,
			sourceEditMode : false,
			onFocus : Ext.emptyFn,
			iframePad : 3,
			hideMode : "offsets",
			defaultAutoCreate : {
				tag : "textarea",
				style : "width:500px;height:300px;",
				autocomplete : "off"
			},
			initComponent : function () {
				this.addEvents("initialize", "activate", "beforesync", "beforepush", "sync", "push", "editmodechange");
				Ext.form.HtmlEditor.superclass.initComponent.call(this)
			},
			createFontOptions : function () {
				var d = [],
				b = this.fontFamilies,
				c,
				g;
				for (var e = 0, a = b.length; e < a; e++) {
					c = b[e];
					g = c.toLowerCase();
					d.push('<option value="', g, '" style="font-family:', c, ';"', (this.defaultFont == g ? ' selected="true">' : ">"), c, "</option>")
				}
				return d.join("")
			},
			createToolbar : function (e) {
				var c = [];
				var a = Ext.QuickTips && Ext.QuickTips.isEnabled();
				function d(j, h, i) {
					return {
						itemId : j,
						cls : "x-btn-icon",
						iconCls : "x-edit-" + j,
						enableToggle : h !== false,
						scope : e,
						handler : i || e.relayBtnCmd,
						clickEvent : "mousedown",
						tooltip : a ? e.buttonTips[j] || undefined : undefined,
						overflowText : e.buttonTips[j].title || undefined,
						tabIndex : -1
					}
				}
				if (this.enableFont && !Ext.isSafari2) {
					var g = new Ext.Toolbar.Item({
								autoEl : {
									tag : "select",
									cls : "x-font-select",
									html : this.createFontOptions()
								}
							});
					c.push(g, "-")
				}
				if (this.enableFormat) {
					c.push(d("bold"), d("italic"), d("underline"))
				}
				if (this.enableFontSize) {
					c.push("-", d("increasefontsize", false, this.adjustFont), d("decreasefontsize", false, this.adjustFont))
				}
				if (this.enableColors) {
					c.push("-", {
							itemId : "forecolor",
							cls : "x-btn-icon",
							iconCls : "x-edit-forecolor",
							clickEvent : "mousedown",
							tooltip : a ? e.buttonTips.forecolor || undefined : undefined,
							tabIndex : -1,
							menu : new Ext.menu.ColorMenu({
									allowReselect : true,
									focus : Ext.emptyFn,
									value : "000000",
									plain : true,
									listeners : {
										scope : this,
										select : function (i, h) {
											this.execCmd("forecolor", Ext.isWebKit || Ext.isIE ? "#" + h : h);
											this.deferFocus()
										}
									},
									clickEvent : "mousedown"
								})
						}, {
							itemId : "backcolor",
							cls : "x-btn-icon",
							iconCls : "x-edit-backcolor",
							clickEvent : "mousedown",
							tooltip : a ? e.buttonTips.backcolor || undefined : undefined,
							tabIndex : -1,
							menu : new Ext.menu.ColorMenu({
									focus : Ext.emptyFn,
									value : "FFFFFF",
									plain : true,
									allowReselect : true,
									listeners : {
										scope : this,
										select : function (i, h) {
											if (Ext.isGecko) {
												this.execCmd("useCSS", false);
												this.execCmd("hilitecolor", h);
												this.execCmd("useCSS", true);
												this.deferFocus()
											} else {
												this.execCmd(Ext.isOpera ? "hilitecolor" : "backcolor", Ext.isWebKit || Ext.isIE ? "#" + h : h);
												this.deferFocus()
											}
										}
									},
									clickEvent : "mousedown"
								})
						})
				}
				if (this.enableAlignments) {
					c.push("-", d("justifyleft"), d("justifycenter"), d("justifyright"))
				}
				if (!Ext.isSafari2) {
					if (this.enableLinks) {
						c.push("-", d("createlink", false, this.createLink))
					}
					if (this.enableLists) {
						c.push("-", d("insertorderedlist"), d("insertunorderedlist"))
					}
					if (this.enableSourceEdit) {
						c.push("-", d("sourceedit", true, function (h) {
									this.toggleSourceEdit(!this.sourceEditMode)
								}))
					}
				}
				var b = new Ext.Toolbar({
							renderTo : this.wrap.dom.firstChild,
							items : c
						});
				if (g) {
					this.fontSelect = g.el;
					this.mon(this.fontSelect, "change", function () {
							var h = this.fontSelect.dom.value;
							this.relayCmd("fontname", h);
							this.deferFocus()
						}, this)
				}
				this.mon(b.el, "click", function (h) {
						h.preventDefault()
					});
				this.tb = b;
				this.tb.doLayout()
			},
			onDisable : function () {
				this.wrap.mask();
				Ext.form.HtmlEditor.superclass.onDisable.call(this)
			},
			onEnable : function () {
				this.wrap.unmask();
				Ext.form.HtmlEditor.superclass.onEnable.call(this)
			},
			setReadOnly : function (b) {
				Ext.form.HtmlEditor.superclass.setReadOnly.call(this, b);
				if (this.initialized) {
					if (Ext.isIE) {
						this.getEditorBody().contentEditable = !b
					} else {
						this.setDesignMode(!b)
					}
					var a = this.getEditorBody();
					if (a) {
						a.style.cursor = this.readOnly ? "default" : "text"
					}
					this.disableItems(b)
				}
			},
			getDocMarkup : function () {
				var a = Ext.fly(this.iframe).getHeight() - this.iframePad * 2;
				return String.format('<html><head><style type="text/css">body{border: 0; margin: 0; padding: {0}px; height: {1}px; cursor: text}</style></head><body></body></html>', this.iframePad, a)
			},
			getEditorBody : function () {
				var a = this.getDoc();
				return a.body || a.documentElement
			},
			getDoc : function () {
				return Ext.isIE ? this.getWin().document : (this.iframe.contentDocument || this.getWin().document)
			},
			getWin : function () {
				return Ext.isIE ? this.iframe.contentWindow : window.frames[this.iframe.name]
			},
			onRender : function (b, a) {
				Ext.form.HtmlEditor.superclass.onRender.call(this, b, a);
				this.el.dom.style.border = "0 none";
				this.el.dom.setAttribute("tabIndex", -1);
				this.el.addClass("x-hidden");
				if (Ext.isIE) {
					this.el.applyStyles("margin-top:-1px;margin-bottom:-1px;")
				}
				this.wrap = this.el.wrap({
							cls : "x-html-editor-wrap",
							cn : {
								cls : "x-html-editor-tb"
							}
						});
				this.createToolbar(this);
				this.disableItems(true);
				this.tb.doLayout();
				this.createIFrame();
				if (!this.width) {
					var c = this.el.getSize();
					this.setSize(c.width, this.height || c.height)
				}
				this.resizeEl = this.positionEl = this.wrap
			},
			createIFrame : function () {
				var a = document.createElement("iframe");
				a.name = Ext.id();
				a.frameBorder = "0";
				a.style.overflow = "auto";
				a.src = Ext.SSL_SECURE_URL;
				this.wrap.dom.appendChild(a);
				this.iframe = a;
				this.monitorTask = Ext.TaskMgr.start({
							run : this.checkDesignMode,
							scope : this,
							interval : 100
						})
			},
			initFrame : function () {
				Ext.TaskMgr.stop(this.monitorTask);
				var b = this.getDoc();
				this.win = this.getWin();
				b.open();
				b.write(this.getDocMarkup());
				b.close();
				var a = {
					run : function () {
						var c = this.getDoc();
						if (c.body || c.readyState == "complete") {
							Ext.TaskMgr.stop(a);
							this.setDesignMode(true);
							this.initEditor.defer(10, this)
						}
					},
					interval : 10,
					duration : 10000,
					scope : this
				};
				Ext.TaskMgr.start(a)
			},
			checkDesignMode : function () {
				if (this.wrap && this.wrap.dom.offsetWidth) {
					var a = this.getDoc();
					if (!a) {
						return
					}
					if (!a.editorInitialized || this.getDesignMode() != "on") {
						this.initFrame()
					}
				}
			},
			setDesignMode : function (b) {
				var a = this.getDoc();
				if (a) {
					if (this.readOnly) {
						b = false
					}
					a.designMode = (/on|true/i).test(String(b).toLowerCase()) ? "on" : "off"
				}
			},
			getDesignMode : function () {
				var a = this.getDoc();
				if (!a) {
					return ""
				}
				return String(a.designMode).toLowerCase()
			},
			disableItems : function (a) {
				if (this.fontSelect) {
					this.fontSelect.dom.disabled = a
				}
				this.tb.items.each(function (b) {
						if (b.getItemId() != "sourceedit") {
							b.setDisabled(a)
						}
					})
			},
			onResize : function (b, c) {
				Ext.form.HtmlEditor.superclass.onResize.apply(this, arguments);
				if (this.el && this.iframe) {
					if (Ext.isNumber(b)) {
						var e = b - this.wrap.getFrameWidth("lr");
						this.el.setWidth(e);
						this.tb.setWidth(e);
						this.iframe.style.width = Math.max(e, 0) + "px"
					}
					if (Ext.isNumber(c)) {
						var a = c - this.wrap.getFrameWidth("tb") - this.tb.el.getHeight();
						this.el.setHeight(a);
						this.iframe.style.height = Math.max(a, 0) + "px";
						var d = this.getEditorBody();
						if (d) {
							d.style.height = Math.max((a - (this.iframePad * 2)), 0) + "px"
						}
					}
				}
			},
			toggleSourceEdit : function (b) {
				var d,
				a;
				if (b === undefined) {
					b = !this.sourceEditMode
				}
				this.sourceEditMode = b === true;
				var c = this.tb.getComponent("sourceedit");
				if (c.pressed !== this.sourceEditMode) {
					c.toggle(this.sourceEditMode);
					if (!c.xtbHidden) {
						return
					}
				}
				if (this.sourceEditMode) {
					this.previousSize = this.getSize();
					d = Ext.get(this.iframe).getHeight();
					this.disableItems(true);
					this.syncValue();
					this.iframe.className = "x-hidden";
					this.el.removeClass("x-hidden");
					this.el.dom.removeAttribute("tabIndex");
					this.el.focus();
					this.el.dom.style.height = d + "px"
				} else {
					a = parseInt(this.el.dom.style.height, 10);
					if (this.initialized) {
						this.disableItems(this.readOnly)
					}
					this.pushValue();
					this.iframe.className = "";
					this.el.addClass("x-hidden");
					this.el.dom.setAttribute("tabIndex", -1);
					this.deferFocus();
					this.setSize(this.previousSize);
					delete this.previousSize;
					this.iframe.style.height = a + "px"
				}
				this.fireEvent("editmodechange", this, this.sourceEditMode)
			},
			createLink : function () {
				var a = prompt(this.createLinkText, this.defaultLinkValue);
				if (a && a != "http://") {
					this.relayCmd("createlink", a)
				}
			},
			initEvents : function () {
				this.originalValue = this.getValue()
			},
			markInvalid : Ext.emptyFn,
			clearInvalid : Ext.emptyFn,
			setValue : function (a) {
				Ext.form.HtmlEditor.superclass.setValue.call(this, a);
				this.pushValue();
				return this
			},
			cleanHtml : function (a) {
				a = String(a);
				if (Ext.isWebKit) {
					a = a.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi, "")
				}
				if (a.charCodeAt(0) == this.defaultValue.replace(/\D/g, "")) {
					a = a.substring(1)
				}
				return a
			},
			syncValue : function () {
				if (this.initialized) {
					var d = this.getEditorBody();
					var c = d.innerHTML;
					if (Ext.isWebKit) {
						var b = d.getAttribute("style");
						var a = b.match(/text-align:(.*?);/i);
						if (a && a[1]) {
							c = '<div style="' + a[0] + '">' + c + "</div>"
						}
					}
					c = this.cleanHtml(c);
					if (this.fireEvent("beforesync", this, c) !== false) {
						this.el.dom.value = c;
						this.fireEvent("sync", this, c)
					}
				}
			},
			getValue : function () {
				this[this.sourceEditMode ? "pushValue" : "syncValue"]();
				return Ext.form.HtmlEditor.superclass.getValue.call(this)
			},
			pushValue : function () {
				if (this.initialized) {
					var a = this.el.dom.value;
					if (!this.activated && a.length < 1) {
						a = this.defaultValue
					}
					if (this.fireEvent("beforepush", this, a) !== false) {
						this.getEditorBody().innerHTML = a;
						if (Ext.isGecko) {
							this.setDesignMode(false);
							this.setDesignMode(true)
						}
						this.fireEvent("push", this, a)
					}
				}
			},
			deferFocus : function () {
				this.focus.defer(10, this)
			},
			focus : function () {
				if (this.win && !this.sourceEditMode) {
					this.win.focus()
				} else {
					this.el.focus()
				}
			},
			initEditor : function () {
				try {
					var c = this.getEditorBody(),
					a = this.el.getStyles("font-size", "font-family", "background-image", "background-repeat", "background-color", "color"),
					g,
					b;
					a["background-attachment"] = "fixed";
					c.bgProperties = "fixed";
					Ext.DomHelper.applyStyles(c, a);
					g = this.getDoc();
					if (g) {
						try {
							Ext.EventManager.removeAll(g)
						} catch (d) {}
						
					}
					b = this.onEditorEvent.createDelegate(this);
					Ext.EventManager.on(g, {
							mousedown : b,
							dblclick : b,
							click : b,
							keyup : b,
							buffer : 100
						});
					if (Ext.isGecko) {
						Ext.EventManager.on(g, "keypress", this.applyCommand, this)
					}
					if (Ext.isIE || Ext.isWebKit || Ext.isOpera) {
						Ext.EventManager.on(g, "keydown", this.fixKeys, this)
					}
					g.editorInitialized = true;
					this.initialized = true;
					this.pushValue();
					this.setReadOnly(this.readOnly);
					this.fireEvent("initialize", this)
				} catch (d) {}
				
			},
			beforeDestroy : function () {
				if (this.monitorTask) {
					Ext.TaskMgr.stop(this.monitorTask)
				}
				if (this.rendered) {
					Ext.destroy(this.tb);
					var b = this.getDoc();
					if (b) {
						try {
							Ext.EventManager.removeAll(b);
							for (var c in b) {
								delete b[c]
							}
						} catch (a) {}
						
					}
					if (this.wrap) {
						this.wrap.dom.innerHTML = "";
						this.wrap.remove()
					}
				}
				Ext.form.HtmlEditor.superclass.beforeDestroy.call(this)
			},
			onFirstFocus : function () {
				this.activated = true;
				this.disableItems(this.readOnly);
				if (Ext.isGecko) {
					this.win.focus();
					var a = this.win.getSelection();
					if (!a.focusNode || a.focusNode.nodeType != 3) {
						var b = a.getRangeAt(0);
						b.selectNodeContents(this.getEditorBody());
						b.collapse(true);
						this.deferFocus()
					}
					try {
						this.execCmd("useCSS", true);
						this.execCmd("styleWithCSS", false)
					} catch (c) {}
					
				}
				this.fireEvent("activate", this)
			},
			adjustFont : function (b) {
				var d = b.getItemId() == "increasefontsize" ? 1 : -1,
				c = this.getDoc(),
				a = parseInt(c.queryCommandValue("FontSize") || 2, 10);
				if ((Ext.isSafari && !Ext.isSafari2) || Ext.isChrome || Ext.isAir) {
					if (a <= 10) {
						a = 1 + d
					} else {
						if (a <= 13) {
							a = 2 + d
						} else {
							if (a <= 16) {
								a = 3 + d
							} else {
								if (a <= 18) {
									a = 4 + d
								} else {
									if (a <= 24) {
										a = 5 + d
									} else {
										a = 6 + d
									}
								}
							}
						}
					}
					a = a.constrain(1, 6)
				} else {
					if (Ext.isSafari) {
						d *= 2
					}
					a = Math.max(1, a + d) + (Ext.isSafari ? "px" : 0)
				}
				this.execCmd("FontSize", a)
			},
			onEditorEvent : function (a) {
				this.updateToolbar()
			},
			updateToolbar : function () {
				if (this.readOnly) {
					return
				}
				if (!this.activated) {
					this.onFirstFocus();
					return
				}
				var b = this.tb.items.map,
				c = this.getDoc();
				if (this.enableFont && !Ext.isSafari2) {
					var a = (c.queryCommandValue("FontName") || this.defaultFont).toLowerCase();
					if (a != this.fontSelect.dom.value) {
						this.fontSelect.dom.value = a
					}
				}
				if (this.enableFormat) {
					b.bold.toggle(c.queryCommandState("bold"));
					b.italic.toggle(c.queryCommandState("italic"));
					b.underline.toggle(c.queryCommandState("underline"))
				}
				if (this.enableAlignments) {
					b.justifyleft.toggle(c.queryCommandState("justifyleft"));
					b.justifycenter.toggle(c.queryCommandState("justifycenter"));
					b.justifyright.toggle(c.queryCommandState("justifyright"))
				}
				if (!Ext.isSafari2 && this.enableLists) {
					b.insertorderedlist.toggle(c.queryCommandState("insertorderedlist"));
					b.insertunorderedlist.toggle(c.queryCommandState("insertunorderedlist"))
				}
				Ext.menu.MenuMgr.hideAll();
				this.syncValue()
			},
			relayBtnCmd : function (a) {
				this.relayCmd(a.getItemId())
			},
			relayCmd : function (b, a) {
				(function () {
						this.focus();
						this.execCmd(b, a);
						this.updateToolbar()
					}).defer(10, this)
			},
			execCmd : function (b, a) {
				var c = this.getDoc();
				c.execCommand(b, false, a === undefined ? null : a);
				this.syncValue()
			},
			applyCommand : function (b) {
				if (b.ctrlKey) {
					var d = b.getCharCode(),
					a;
					if (d > 0) {
						d = String.fromCharCode(d);
						switch (d) {
						case "b":
							a = "bold";
							break;
						case "i":
							a = "italic";
							break;
						case "u":
							a = "underline";
							break
						}
						if (a) {
							this.win.focus();
							this.execCmd(a);
							this.deferFocus();
							b.preventDefault()
						}
					}
				}
			},
			insertAtCursor : function (c) {
				if (!this.activated) {
					return
				}
				if (Ext.isIE) {
					this.win.focus();
					var b = this.getDoc(),
					a = b.selection.createRange();
					if (a) {
						a.pasteHTML(c);
						this.syncValue();
						this.deferFocus()
					}
				} else {
					this.win.focus();
					this.execCmd("InsertHTML", c);
					this.deferFocus()
				}
			},
			fixKeys : function () {
				if (Ext.isIE) {
					return function (g) {
						var a = g.getKey(),
						d = this.getDoc(),
						b;
						if (a == g.TAB) {
							g.stopEvent();
							b = d.selection.createRange();
							if (b) {
								b.collapse(true);
								b.pasteHTML("&nbsp;&nbsp;&nbsp;&nbsp;");
								this.deferFocus()
							}
						} else {
							if (a == g.ENTER) {
								b = d.selection.createRange();
								if (b) {
									var c = b.parentElement();
									if (!c || c.tagName.toLowerCase() != "li") {
										g.stopEvent();
										b.pasteHTML("<br />");
										b.collapse(false);
										b.select()
									}
								}
							}
						}
					}
				} else {
					if (Ext.isOpera) {
						return function (b) {
							var a = b.getKey();
							if (a == b.TAB) {
								b.stopEvent();
								this.win.focus();
								this.execCmd("InsertHTML", "&nbsp;&nbsp;&nbsp;&nbsp;");
								this.deferFocus()
							}
						}
					} else {
						if (Ext.isWebKit) {
							return function (b) {
								var a = b.getKey();
								if (a == b.TAB) {
									b.stopEvent();
									this.execCmd("InsertText", "\t");
									this.deferFocus()
								} else {
									if (a == b.ENTER) {
										b.stopEvent();
										this.execCmd("InsertHtml", "<br /><br />");
										this.deferFocus()
									}
								}
							}
						}
					}
				}
			}
			(),
			getToolbar : function () {
				return this.tb
			},
			buttonTips : {
				bold : {
					title : "Bold (Ctrl+B)",
					text : "Make the selected text bold.",
					cls : "x-html-editor-tip"
				},
				italic : {
					title : "Italic (Ctrl+I)",
					text : "Make the selected text italic.",
					cls : "x-html-editor-tip"
				},
				underline : {
					title : "Underline (Ctrl+U)",
					text : "Underline the selected text.",
					cls : "x-html-editor-tip"
				},
				increasefontsize : {
					title : "Grow Text",
					text : "Increase the font size.",
					cls : "x-html-editor-tip"
				},
				decreasefontsize : {
					title : "Shrink Text",
					text : "Decrease the font size.",
					cls : "x-html-editor-tip"
				},
				backcolor : {
					title : "Text Highlight Color",
					text : "Change the background color of the selected text.",
					cls : "x-html-editor-tip"
				},
				forecolor : {
					title : "Font Color",
					text : "Change the color of the selected text.",
					cls : "x-html-editor-tip"
				},
				justifyleft : {
					title : "Align Text Left",
					text : "Align text to the left.",
					cls : "x-html-editor-tip"
				},
				justifycenter : {
					title : "Center Text",
					text : "Center text in the editor.",
					cls : "x-html-editor-tip"
				},
				justifyright : {
					title : "Align Text Right",
					text : "Align text to the right.",
					cls : "x-html-editor-tip"
				},
				insertunorderedlist : {
					title : "Bullet List",
					text : "Start a bulleted list.",
					cls : "x-html-editor-tip"
				},
				insertorderedlist : {
					title : "Numbered List",
					text : "Start a numbered list.",
					cls : "x-html-editor-tip"
				},
				createlink : {
					title : "Hyperlink",
					text : "Make the selected text a hyperlink.",
					cls : "x-html-editor-tip"
				},
				sourceedit : {
					title : "Source Edit",
					text : "Switch to source editing mode.",
					cls : "x-html-editor-tip"
				}
			}
		});
Ext.reg("htmleditor", Ext.form.HtmlEditor);
Ext.form.TimeField = Ext.extend(Ext.form.ComboBox, {
			minValue : undefined,
			maxValue : undefined,
			minText : "The time in this field must be equal to or after {0}",
			maxText : "The time in this field must be equal to or before {0}",
			invalidText : "{0} is not a valid time",
			format : "g:i A",
			altFormats : "g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H|gi a|hi a|giA|hiA|gi A|hi A",
			increment : 15,
			mode : "local",
			triggerAction : "all",
			typeAhead : false,
			initDate : "1/1/2008",
			initDateFormat : "j/n/Y",
			initComponent : function () {
				if (Ext.isDefined(this.minValue)) {
					this.setMinValue(this.minValue, true)
				}
				if (Ext.isDefined(this.maxValue)) {
					this.setMaxValue(this.maxValue, true)
				}
				if (!this.store) {
					this.generateStore(true)
				}
				Ext.form.TimeField.superclass.initComponent.call(this)
			},
			setMinValue : function (b, a) {
				this.setLimit(b, true, a);
				return this
			},
			setMaxValue : function (b, a) {
				this.setLimit(b, false, a);
				return this
			},
			generateStore : function (b) {
				var c = this.minValue || new Date(this.initDate).clearTime(),
				a = this.maxValue || new Date(this.initDate).clearTime().add("mi", (24 * 60) - 1),
				d = [];
				while (c <= a) {
					d.push(c.dateFormat(this.format));
					c = c.add("mi", this.increment)
				}
				this.bindStore(d, b)
			},
			setLimit : function (b, g, a) {
				var e;
				if (Ext.isString(b)) {
					e = this.parseDate(b)
				} else {
					if (Ext.isDate(b)) {
						e = b
					}
				}
				if (e) {
					var c = new Date(this.initDate).clearTime();
					c.setHours(e.getHours(), e.getMinutes(), e.getSeconds(), e.getMilliseconds());
					this[g ? "minValue" : "maxValue"] = c;
					if (!a) {
						this.generateStore()
					}
				}
			},
			getValue : function () {
				var a = Ext.form.TimeField.superclass.getValue.call(this);
				return this.formatDate(this.parseDate(a)) || ""
			},
			setValue : function (a) {
				return Ext.form.TimeField.superclass.setValue.call(this, this.formatDate(this.parseDate(a)))
			},
			validateValue : Ext.form.DateField.prototype.validateValue,
			formatDate : Ext.form.DateField.prototype.formatDate,
			parseDate : function (h) {
				if (!h || Ext.isDate(h)) {
					return h
				}
				var j = this.initDate + " ",
				g = this.initDateFormat + " ",
				b = Date.parseDate(j + h, g + this.format),
				c = this.altFormats;
				if (!b && c) {
					if (!this.altFormatsArray) {
						this.altFormatsArray = c.split("|")
					}
					for (var e = 0, d = this.altFormatsArray, a = d.length; e < a && !b; e++) {
						b = Date.parseDate(j + h, g + d[e])
					}
				}
				return b
			}
		});
Ext.reg("timefield", Ext.form.TimeField);
Ext.form.SliderField = Ext.extend(Ext.form.Field, {
			useTips : true,
			tipText : null,
			actionMode : "wrap",
			initComponent : function () {
				var b = Ext.copyTo({
							id : this.id + "-slider"
						}, this.initialConfig, ["vertical", "minValue", "maxValue", "decimalPrecision", "keyIncrement", "increment", "clickToChange", "animate"]);
				if (this.useTips) {
					var a = this.tipText ? {
							getText : this.tipText
						}
						 : {};
					b.plugins = [new Ext.slider.Tip(a)]
				}
				this.slider = new Ext.Slider(b);
				Ext.form.SliderField.superclass.initComponent.call(this)
			},
			onRender : function (b, a) {
				this.autoCreate = {
					id : this.id,
					name : this.name,
					type : "hidden",
					tag : "input"
				};
				Ext.form.SliderField.superclass.onRender.call(this, b, a);
				this.wrap = this.el.wrap({
							cls : "x-form-field-wrap"
						});
				this.resizeEl = this.positionEl = this.wrap;
				this.slider.render(this.wrap)
			},
			onResize : function (b, c, d, a) {
				Ext.form.SliderField.superclass.onResize.call(this, b, c, d, a);
				this.slider.setSize(b, c)
			},
			initEvents : function () {
				Ext.form.SliderField.superclass.initEvents.call(this);
				this.slider.on("change", this.onChange, this)
			},
			onChange : function (b, a) {
				this.setValue(a, undefined, true)
			},
			onEnable : function () {
				Ext.form.SliderField.superclass.onEnable.call(this);
				this.slider.enable()
			},
			onDisable : function () {
				Ext.form.SliderField.superclass.onDisable.call(this);
				this.slider.disable()
			},
			beforeDestroy : function () {
				Ext.destroy(this.slider);
				Ext.form.SliderField.superclass.beforeDestroy.call(this)
			},
			alignErrorIcon : function () {
				this.errorIcon.alignTo(this.slider.el, "tl-tr", [2, 0])
			},
			setMinValue : function (a) {
				this.slider.setMinValue(a);
				return this
			},
			setMaxValue : function (a) {
				this.slider.setMaxValue(a);
				return this
			},
			setValue : function (c, b, a) {
				if (!a) {
					this.slider.setValue(c, b)
				}
				return Ext.form.SliderField.superclass.setValue.call(this, this.slider.getValue())
			},
			getValue : function () {
				return this.slider.getValue()
			}
		});
Ext.reg("sliderfield", Ext.form.SliderField);
Ext.form.Label = Ext.extend(Ext.BoxComponent, {
			onRender : function (b, a) {
				if (!this.el) {
					this.el = document.createElement("label");
					this.el.id = this.getId();
					this.el.innerHTML = this.text ? Ext.util.Format.htmlEncode(this.text) : (this.html || "");
					if (this.forId) {
						this.el.setAttribute("for", this.forId)
					}
				}
				Ext.form.Label.superclass.onRender.call(this, b, a)
			},
			setText : function (a, b) {
				var c = b === false;
				this[!c ? "text" : "html"] = a;
				delete this[c ? "text" : "html"];
				if (this.rendered) {
					this.el.dom.innerHTML = b !== false ? Ext.util.Format.htmlEncode(a) : a
				}
				return this
			}
		});
Ext.reg("label", Ext.form.Label);
Ext.form.Action = function (b, a) {
	this.form = b;
	this.options = a || {}
		
};
Ext.form.Action.CLIENT_INVALID = "client";
Ext.form.Action.SERVER_INVALID = "server";
Ext.form.Action.CONNECT_FAILURE = "connect";
Ext.form.Action.LOAD_FAILURE = "load";
Ext.form.Action.prototype = {
	type : "default",
	run : function (a) {},
	success : function (a) {},
	handleResponse : function (a) {},
	failure : function (a) {
		this.response = a;
		this.failureType = Ext.form.Action.CONNECT_FAILURE;
		this.form.afterAction(this, false)
	},
	processResponse : function (a) {
		this.response = a;
		if (!a.responseText && !a.responseXML) {
			return true
		}
		this.result = this.handleResponse(a);
		return this.result
	},
	decodeResponse : function (a) {
		try {
			return Ext.decode(a.responseText)
		} catch (b) {
			return false
		}
	},
	getUrl : function (c) {
		var a = this.options.url || this.form.url || this.form.el.dom.action;
		if (c) {
			var b = this.getParams();
			if (b) {
				a = Ext.urlAppend(a, b)
			}
		}
		return a
	},
	getMethod : function () {
		return (this.options.method || this.form.method || this.form.el.dom.method || "POST").toUpperCase()
	},
	getParams : function () {
		var a = this.form.baseParams;
		var b = this.options.params;
		if (b) {
			if (typeof b == "object") {
				b = Ext.urlEncode(Ext.applyIf(b, a))
			} else {
				if (typeof b == "string" && a) {
					b += "&" + Ext.urlEncode(a)
				}
			}
		} else {
			if (a) {
				b = Ext.urlEncode(a)
			}
		}
		return b
	},
	createCallback : function (a) {
		var a = a || {};
		return {
			success : this.success,
			failure : this.failure,
			scope : this,
			timeout : (a.timeout * 1000) || (this.form.timeout * 1000),
			upload : this.form.fileUpload ? this.success : undefined
		}
	}
};
Ext.form.Action.Submit = function (b, a) {
	Ext.form.Action.Submit.superclass.constructor.call(this, b, a)
};
Ext.extend(Ext.form.Action.Submit, Ext.form.Action, {
		type : "submit",
		run : function () {
			var e = this.options,
			g = this.getMethod(),
			d = g == "GET";
			if (e.clientValidation === false || this.form.isValid()) {
				if (e.submitEmptyText === false) {
					var a = this.form.items,
					c = [],
					b = function (h) {
						if (h.el.getValue() == h.emptyText) {
							c.push(h);
							h.el.dom.value = ""
						}
						if (h.isComposite && h.rendered) {
							h.items.each(b)
						}
					};
					a.each(b)
				}
				Ext.Ajax.request(Ext.apply(this.createCallback(e), {
							form : this.form.el.dom,
							url : this.getUrl(d),
							method : g,
							headers : e.headers,
							params : !d ? this.getParams() : null,
							isUpload : this.form.fileUpload
						}));
				if (e.submitEmptyText === false) {
					Ext.each(c, function (h) {
							if (h.applyEmptyText) {
								h.applyEmptyText()
							}
						})
				}
			} else {
				if (e.clientValidation !== false) {
					this.failureType = Ext.form.Action.CLIENT_INVALID;
					this.form.afterAction(this, false)
				}
			}
		},
		success : function (b) {
			var a = this.processResponse(b);
			if (a === true || a.success) {
				this.form.afterAction(this, true);
				return
			}
			if (a.errors) {
				this.form.markInvalid(a.errors)
			}
			this.failureType = Ext.form.Action.SERVER_INVALID;
			this.form.afterAction(this, false)
		},
		handleResponse : function (c) {
			if (this.form.errorReader) {
				var b = this.form.errorReader.read(c);
				var g = [];
				if (b.records) {
					for (var d = 0, a = b.records.length; d < a; d++) {
						var e = b.records[d];
						g[d] = e.data
					}
				}
				if (g.length < 1) {
					g = null
				}
				return {
					success : b.success,
					errors : g
				}
			}
			return this.decodeResponse(c)
		}
	});
Ext.form.Action.Load = function (b, a) {
	Ext.form.Action.Load.superclass.constructor.call(this, b, a);
	this.reader = this.form.reader
};
Ext.extend(Ext.form.Action.Load, Ext.form.Action, {
		type : "load",
		run : function () {
			Ext.Ajax.request(Ext.apply(this.createCallback(this.options), {
						method : this.getMethod(),
						url : this.getUrl(false),
						headers : this.options.headers,
						params : this.getParams()
					}))
		},
		success : function (b) {
			var a = this.processResponse(b);
			if (a === true || !a.success || !a.data) {
				this.failureType = Ext.form.Action.LOAD_FAILURE;
				this.form.afterAction(this, false);
				return
			}
			this.form.clearInvalid();
			this.form.setValues(a.data);
			this.form.afterAction(this, true)
		},
		handleResponse : function (b) {
			if (this.form.reader) {
				var a = this.form.reader.read(b);
				var c = a.records && a.records[0] ? a.records[0].data : null;
				return {
					success : a.success,
					data : c
				}
			}
			return this.decodeResponse(b)
		}
	});
Ext.form.Action.DirectLoad = Ext.extend(Ext.form.Action.Load, {
			constructor : function (b, a) {
				Ext.form.Action.DirectLoad.superclass.constructor.call(this, b, a)
			},
			type : "directload",
			run : function () {
				var a = this.getParams();
				a.push(this.success, this);
				this.form.api.load.apply(window, a)
			},
			getParams : function () {
				var c = [],
				h = {};
				var e = this.form.baseParams;
				var g = this.options.params;
				Ext.apply(h, g, e);
				var b = this.form.paramOrder;
				if (b) {
					for (var d = 0, a = b.length; d < a; d++) {
						c.push(h[b[d]])
					}
				} else {
					if (this.form.paramsAsHash) {
						c.push(h)
					}
				}
				return c
			},
			processResponse : function (a) {
				this.result = a;
				return a
			},
			success : function (a, b) {
				if (b.type == Ext.Direct.exceptions.SERVER) {
					a = {}
					
				}
				Ext.form.Action.DirectLoad.superclass.success.call(this, a)
			}
		});
Ext.form.Action.DirectSubmit = Ext.extend(Ext.form.Action.Submit, {
			constructor : function (b, a) {
				Ext.form.Action.DirectSubmit.superclass.constructor.call(this, b, a)
			},
			type : "directsubmit",
			run : function () {
				var a = this.options;
				if (a.clientValidation === false || this.form.isValid()) {
					this.success.params = this.getParams();
					this.form.api.submit(this.form.el.dom, this.success, this)
				} else {
					if (a.clientValidation !== false) {
						this.failureType = Ext.form.Action.CLIENT_INVALID;
						this.form.afterAction(this, false)
					}
				}
			},
			getParams : function () {
				var c = {};
				var a = this.form.baseParams;
				var b = this.options.params;
				Ext.apply(c, b, a);
				return c
			},
			processResponse : function (a) {
				this.result = a;
				return a
			},
			success : function (a, b) {
				if (b.type == Ext.Direct.exceptions.SERVER) {
					a = {}
					
				}
				Ext.form.Action.DirectSubmit.superclass.success.call(this, a)
			}
		});
Ext.form.Action.ACTION_TYPES = {
	load : Ext.form.Action.Load,
	submit : Ext.form.Action.Submit,
	directload : Ext.form.Action.DirectLoad,
	directsubmit : Ext.form.Action.DirectSubmit
};
Ext.form.VTypes = function () {
	var c = /^[a-zA-Z_]+$/,
	d = /^[a-zA-Z0-9_]+$/,
	b = /^(\w+)([\-+.\'][\w]+)*@(\w[\-\w]*\.){1,5}([A-Za-z]){2,6}$/,
	a = /(((^https?)|(^ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
	return {
		email : function (e) {
			return b.test(e)
		},
		emailText : 'This field should be an e-mail address in the format "user@example.com"',
		emailMask : /[a-z0-9_\.\-\+\'@]/i,
		url : function (e) {
			return a.test(e)
		},
		urlText : 'This field should be a URL in the format "http://www.example.com"',
		alpha : function (e) {
			return c.test(e)
		},
		alphaText : "This field should only contain letters and _",
		alphaMask : /[a-z_]/i,
		alphanum : function (e) {
			return d.test(e)
		},
		alphanumText : "This field should only contain letters, numbers and _",
		alphanumMask : /[a-z0-9_]/i
	}
}
();
Ext.grid.GridPanel = Ext.extend(Ext.Panel, {
			autoExpandColumn : false,
			autoExpandMax : 1000,
			autoExpandMin : 50,
			columnLines : false,
			ddText : "{0} selected row{1}",
			deferRowRender : true,
			enableColumnHide : true,
			enableColumnMove : true,
			enableDragDrop : false,
			enableHdMenu : true,
			loadMask : false,
			minColumnWidth : 25,
			stripeRows : false,
			trackMouseOver : true,
			stateEvents : ["columnmove", "columnresize", "sortchange", "groupchange"],
			view : null,
			bubbleEvents : [],
			rendered : false,
			viewReady : false,
			initComponent : function () {
				Ext.grid.GridPanel.superclass.initComponent.call(this);
				if (this.columnLines) {
					this.cls = (this.cls || "") + " x-grid-with-col-lines"
				}
				this.autoScroll = false;
				this.autoWidth = false;
				if (Ext.isArray(this.columns)) {
					this.colModel = new Ext.grid.ColumnModel(this.columns);
					delete this.columns
				}
				if (this.ds) {
					this.store = this.ds;
					delete this.ds
				}
				if (this.cm) {
					this.colModel = this.cm;
					delete this.cm
				}
				if (this.sm) {
					this.selModel = this.sm;
					delete this.sm
				}
				this.store = Ext.StoreMgr.lookup(this.store);
				this.addEvents("click", "dblclick", "contextmenu", "mousedown", "mouseup", "mouseover", "mouseout", "keypress", "keydown", "cellmousedown", "rowmousedown", "headermousedown", "groupmousedown", "rowbodymousedown", "containermousedown", "cellclick", "celldblclick", "rowclick", "rowdblclick", "headerclick", "headerdblclick", "groupclick", "groupdblclick", "containerclick", "containerdblclick", "rowbodyclick", "rowbodydblclick", "rowcontextmenu", "cellcontextmenu", "headercontextmenu", "groupcontextmenu", "containercontextmenu", "rowbodycontextmenu", "bodyscroll", "columnresize", "columnmove", "sortchange", "groupchange", "reconfigure", "viewready")
			},
			onRender : function (d, a) {
				Ext.grid.GridPanel.superclass.onRender.apply(this, arguments);
				var e = this.getGridEl();
				this.el.addClass("x-grid-panel");
				this.mon(e, {
						scope : this,
						mousedown : this.onMouseDown,
						click : this.onClick,
						dblclick : this.onDblClick,
						contextmenu : this.onContextMenu
					});
				this.relayEvents(e, ["mousedown", "mouseup", "mouseover", "mouseout", "keypress", "keydown"]);
				var b = this.getView();
				b.init(this);
				b.render();
				this.getSelectionModel().init(this)
			},
			initEvents : function () {
				Ext.grid.GridPanel.superclass.initEvents.call(this);
				if (this.loadMask) {
					this.loadMask = new Ext.LoadMask(this.bwrap, Ext.apply({
									store : this.store
								}, this.loadMask))
				}
			},
			initStateEvents : function () {
				Ext.grid.GridPanel.superclass.initStateEvents.call(this);
				this.mon(this.colModel, "hiddenchange", this.saveState, this, {
						delay : 100
					})
			},
			applyState : function (a) {
				var k = this.colModel,
				g = a.columns,
				j = this.store,
				m,
				h,
				l;
				if (g) {
					for (var d = 0, e = g.length; d < e; d++) {
						m = g[d];
						h = k.getColumnById(m.id);
						if (h) {
							l = k.getIndexById(m.id);
							k.setState(l, {
									hidden : m.hidden,
									width : m.width,
									sortable : m.sortable
								});
							if (l != d) {
								k.moveColumn(l, d)
							}
						}
					}
				}
				if (j) {
					m = a.sort;
					if (m) {
						j[j.remoteSort ? "setDefaultSort" : "sort"](m.field, m.direction)
					}
					m = a.group;
					if (j.groupBy) {
						if (m) {
							j.groupBy(m)
						} else {
							j.clearGrouping()
						}
					}
				}
				var b = Ext.apply({}, a);
				delete b.columns;
				delete b.sort;
				Ext.grid.GridPanel.superclass.applyState.call(this, b)
			},
			getState : function () {
				var g = {
					columns : []
				},
				b = this.store,
				e,
				a;
				for (var d = 0, h; (h = this.colModel.config[d]); d++) {
					g.columns[d] = {
						id : h.id,
						width : h.width
					};
					if (h.hidden) {
						g.columns[d].hidden = true
					}
					if (h.sortable) {
						g.columns[d].sortable = true
					}
				}
				if (b) {
					e = b.getSortState();
					if (e) {
						g.sort = e
					}
					if (b.getGroupState) {
						a = b.getGroupState();
						if (a) {
							g.group = a
						}
					}
				}
				return g
			},
			afterRender : function () {
				Ext.grid.GridPanel.superclass.afterRender.call(this);
				var a = this.view;
				this.on("bodyresize", a.layout, a);
				a.layout(true);
				if (this.deferRowRender) {
					if (!this.deferRowRenderTask) {
						this.deferRowRenderTask = new Ext.util.DelayedTask(a.afterRender, this.view)
					}
					this.deferRowRenderTask.delay(10)
				} else {
					a.afterRender()
				}
				this.viewReady = true
			},
			reconfigure : function (a, b) {
				var c = this.rendered;
				if (c) {
					if (this.loadMask) {
						this.loadMask.destroy();
						this.loadMask = new Ext.LoadMask(this.bwrap, Ext.apply({}, {
										store : a
									}, this.initialConfig.loadMask))
					}
				}
				if (this.view) {
					this.view.initData(a, b)
				}
				this.store = a;
				this.colModel = b;
				if (c) {
					this.view.refresh(true)
				}
				this.fireEvent("reconfigure", this, a, b)
			},
			onDestroy : function () {
				if (this.deferRowRenderTask && this.deferRowRenderTask.cancel) {
					this.deferRowRenderTask.cancel()
				}
				if (this.rendered) {
					Ext.destroy(this.view, this.loadMask)
				} else {
					if (this.store && this.store.autoDestroy) {
						this.store.destroy()
					}
				}
				Ext.destroy(this.colModel, this.selModel);
				this.store = this.selModel = this.colModel = this.view = this.loadMask = null;
				Ext.grid.GridPanel.superclass.onDestroy.call(this)
			},
			processEvent : function (a, b) {
				this.view.processEvent(a, b)
			},
			onClick : function (a) {
				this.processEvent("click", a)
			},
			onMouseDown : function (a) {
				this.processEvent("mousedown", a)
			},
			onContextMenu : function (b, a) {
				this.processEvent("contextmenu", b)
			},
			onDblClick : function (a) {
				this.processEvent("dblclick", a)
			},
			walkCells : function (k, c, b, e, j) {
				var i = this.colModel,
				g = i.getColumnCount(),
				a = this.store,
				h = a.getCount(),
				d = true;
				if (b < 0) {
					if (c < 0) {
						k--;
						d = false
					}
					while (k >= 0) {
						if (!d) {
							c = g - 1
						}
						d = false;
						while (c >= 0) {
							if (e.call(j || this, k, c, i) === true) {
								return [k, c]
							}
							c--
						}
						k--
					}
				} else {
					if (c >= g) {
						k++;
						d = false
					}
					while (k < h) {
						if (!d) {
							c = 0
						}
						d = false;
						while (c < g) {
							if (e.call(j || this, k, c, i) === true) {
								return [k, c]
							}
							c++
						}
						k++
					}
				}
				return null
			},
			getGridEl : function () {
				return this.body
			},
			stopEditing : Ext.emptyFn,
			getSelectionModel : function () {
				if (!this.selModel) {
					this.selModel = new Ext.grid.RowSelectionModel(this.disableSelection ? {
								selectRow : Ext.emptyFn
							}
							 : null)
				}
				return this.selModel
			},
			getStore : function () {
				return this.store
			},
			getColumnModel : function () {
				return this.colModel
			},
			getView : function () {
				if (!this.view) {
					this.view = new Ext.grid.GridView(this.viewConfig)
				}
				return this.view
			},
			getDragDropText : function () {
				var a = this.selModel.getCount();
				return String.format(this.ddText, a, a == 1 ? "" : "s")
			}
		});
Ext.reg("grid", Ext.grid.GridPanel);
Ext.grid.PivotGrid = Ext.extend(Ext.grid.GridPanel, {
			aggregator : "sum",
			renderer : undefined,
			initComponent : function () {
				Ext.grid.PivotGrid.superclass.initComponent.apply(this, arguments);
				this.initAxes();
				this.enableColumnResize = false;
				this.viewConfig = Ext.apply(this.viewConfig || {}, {
							forceFit : true
						});
				this.colModel = new Ext.grid.ColumnModel({})
			},
			getAggregator : function () {
				if (typeof this.aggregator == "string") {
					return Ext.grid.PivotAggregatorMgr.types[this.aggregator]
				} else {
					return this.aggregator
				}
			},
			setAggregator : function (a) {
				this.aggregator = a
			},
			setMeasure : function (a) {
				this.measure = a
			},
			setLeftAxis : function (b, a) {
				this.leftAxis = b;
				if (a) {
					this.view.refresh()
				}
			},
			setTopAxis : function (b, a) {
				this.topAxis = b;
				if (a) {
					this.view.refresh()
				}
			},
			initAxes : function () {
				var a = Ext.grid.PivotAxis;
				if (!(this.leftAxis instanceof a)) {
					this.setLeftAxis(new a({
								orientation : "vertical",
								dimensions : this.leftAxis || [],
								store : this.store
							}))
				}
				if (!(this.topAxis instanceof a)) {
					this.setTopAxis(new a({
								orientation : "horizontal",
								dimensions : this.topAxis || [],
								store : this.store
							}))
				}
			},
			extractData : function () {
				var c = this.store.data.items,
				s = c.length,
				q = [],
				h,
				g,
				e,
				d;
				if (s == 0) {
					return []
				}
				var l = this.leftAxis.getTuples(),
				o = l.length,
				m = this.topAxis.getTuples(),
				a = m.length,
				b = this.getAggregator();
				for (g = 0; g < s; g++) {
					h = c[g];
					for (e = 0; e < o; e++) {
						q[e] = q[e] || [];
						if (l[e].matcher(h) === true) {
							for (d = 0; d < a; d++) {
								q[e][d] = q[e][d] || [];
								if (m[d].matcher(h)) {
									q[e][d].push(h)
								}
							}
						}
					}
				}
				var n = q.length,
				p,
				r;
				for (g = 0; g < n; g++) {
					r = q[g];
					p = r.length;
					for (e = 0; e < p; e++) {
						q[g][e] = b(q[g][e], this.measure)
					}
				}
				return q
			},
			getView : function () {
				if (!this.view) {
					this.view = new Ext.grid.PivotGridView(this.viewConfig)
				}
				return this.view
			}
		});
Ext.reg("pivotgrid", Ext.grid.PivotGrid);
Ext.grid.PivotAggregatorMgr = new Ext.AbstractManager();
Ext.grid.PivotAggregatorMgr.registerType("sum", function (a, c) {
		var e = a.length,
		d = 0,
		b;
		for (b = 0; b < e; b++) {
			d += a[b].get(c)
		}
		return d
	});
Ext.grid.PivotAggregatorMgr.registerType("avg", function (a, c) {
		var e = a.length,
		d = 0,
		b;
		for (b = 0; b < e; b++) {
			d += a[b].get(c)
		}
		return (d / e) || "n/a"
	});
Ext.grid.PivotAggregatorMgr.registerType("min", function (a, c) {
		var e = [],
		d = a.length,
		b;
		for (b = 0; b < d; b++) {
			e.push(a[b].get(c))
		}
		return Math.min.apply(this, e) || "n/a"
	});
Ext.grid.PivotAggregatorMgr.registerType("max", function (a, c) {
		var e = [],
		d = a.length,
		b;
		for (b = 0; b < d; b++) {
			e.push(a[b].get(c))
		}
		return Math.max.apply(this, e) || "n/a"
	});
Ext.grid.PivotAggregatorMgr.registerType("count", function (a, b) {
		return a.length
	});
Ext.grid.GridView = Ext.extend(Ext.util.Observable, {
			deferEmptyText : true,
			scrollOffset : undefined,
			autoFill : false,
			forceFit : false,
			sortClasses : ["sort-asc", "sort-desc"],
			sortAscText : "Sort Ascending",
			sortDescText : "Sort Descending",
			columnsText : "Columns",
			selectedRowClass : "x-grid3-row-selected",
			borderWidth : 2,
			tdClass : "x-grid3-cell",
			hdCls : "x-grid3-hd",
			markDirty : true,
			cellSelectorDepth : 4,
			rowSelectorDepth : 10,
			rowBodySelectorDepth : 10,
			cellSelector : "td.x-grid3-cell",
			rowSelector : "div.x-grid3-row",
			rowBodySelector : "div.x-grid3-row-body",
			firstRowCls : "x-grid3-row-first",
			lastRowCls : "x-grid3-row-last",
			rowClsRe : /(?:^|\s+)x-grid3-row-(first|last|alt)(?:\s+|$)/g,
			headerMenuOpenCls : "x-grid3-hd-menu-open",
			rowOverCls : "x-grid3-row-over",
			constructor : function (a) {
				Ext.apply(this, a);
				this.addEvents("beforerowremoved", "beforerowsinserted", "beforerefresh", "rowremoved", "rowsinserted", "rowupdated", "refresh");
				Ext.grid.GridView.superclass.constructor.call(this)
			},
			masterTpl : new Ext.Template('<div class="x-grid3" hidefocus="true">', '<div class="x-grid3-viewport">', '<div class="x-grid3-header">', '<div class="x-grid3-header-inner">', '<div class="x-grid3-header-offset" style="{ostyle}">{header}</div>', "</div>", '<div class="x-clear"></div>', "</div>", '<div class="x-grid3-scroller">', '<div class="x-grid3-body" style="{bstyle}">{body}</div>', '<a href="#" class="x-grid3-focus" tabIndex="-1"></a>', "</div>", "</div>", '<div class="x-grid3-resize-marker">&#160;</div>', '<div class="x-grid3-resize-proxy">&#160;</div>', "</div>"),
			headerTpl : new Ext.Template('<table border="0" cellspacing="0" cellpadding="0" style="{tstyle}">', "<thead>", '<tr class="x-grid3-hd-row">{cells}</tr>', "</thead>", "</table>"),
			bodyTpl : new Ext.Template("{rows}"),
			cellTpl : new Ext.Template('<td class="x-grid3-col x-grid3-cell x-grid3-td-{id} {css}" style="{style}" tabIndex="0" {cellAttr}>', '<div class="x-grid3-cell-inner x-grid3-col-{id}" unselectable="on" {attr}>{value}</div>', "</td>"),
			initTemplates : function () {
				var c = this.templates || {},
				d,
				b,
				g = new Ext.Template('<td class="x-grid3-hd x-grid3-cell x-grid3-td-{id} {css}" style="{style}">', '<div {tooltip} {attr} class="x-grid3-hd-inner x-grid3-hd-{id}" unselectable="on" style="{istyle}">', this.grid.enableHdMenu ? '<a class="x-grid3-hd-btn" href="#"></a>' : "", "{value}", '<img alt="" class="x-grid3-sort-icon" src="', Ext.BLANK_IMAGE_URL, '" />', "</div>", "</td>"),
				a = ['<tr class="x-grid3-row-body-tr" style="{bodyStyle}">', '<td colspan="{cols}" class="x-grid3-body-cell" tabIndex="0" hidefocus="on">', '<div class="x-grid3-row-body">{body}</div>', "</td>", "</tr>"].join(""),
				e = ['<table class="x-grid3-row-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">', "<tbody>", "<tr>{cells}</tr>", this.enableRowBody ? a : "", "</tbody>", "</table>"].join("");
				Ext.applyIf(c, {
						hcell : g,
						cell : this.cellTpl,
						body : this.bodyTpl,
						header : this.headerTpl,
						master : this.masterTpl,
						row : new Ext.Template('<div class="x-grid3-row {alt}" style="{tstyle}">' + e + "</div>"),
						rowInner : new Ext.Template(e)
					});
				for (b in c) {
					d = c[b];
					if (d && Ext.isFunction(d.compile) && !d.compiled) {
						d.disableFormats = true;
						d.compile()
					}
				}
				this.templates = c;
				this.colRe = new RegExp("x-grid3-td-([^\\s]+)", "")
			},
			fly : function (a) {
				if (!this._flyweight) {
					this._flyweight = new Ext.Element.Flyweight(document.body)
				}
				this._flyweight.dom = a;
				return this._flyweight
			},
			getEditorParent : function () {
				return this.scroller.dom
			},
			initElements : function () {
				var b = Ext.Element,
				d = Ext.get(this.grid.getGridEl().dom.firstChild),
				e = new b(d.child("div.x-grid3-viewport")),
				c = new b(e.child("div.x-grid3-header")),
				a = new b(e.child("div.x-grid3-scroller"));
				if (this.grid.hideHeaders) {
					c.setDisplayed(false)
				}
				if (this.forceFit) {
					a.setStyle("overflow-x", "hidden")
				}
				Ext.apply(this, {
						el : d,
						mainWrap : e,
						scroller : a,
						mainHd : c,
						innerHd : c.child("div.x-grid3-header-inner").dom,
						mainBody : new b(b.fly(a).child("div.x-grid3-body")),
						focusEl : new b(b.fly(a).child("a")),
						resizeMarker : new b(d.child("div.x-grid3-resize-marker")),
						resizeProxy : new b(d.child("div.x-grid3-resize-proxy"))
					});
				this.focusEl.swallowEvent("click", true)
			},
			getRows : function () {
				return this.hasRows() ? this.mainBody.dom.childNodes : []
			},
			findCell : function (a) {
				if (!a) {
					return false
				}
				return this.fly(a).findParent(this.cellSelector, this.cellSelectorDepth)
			},
			findCellIndex : function (d, c) {
				var b = this.findCell(d),
				a;
				if (b) {
					a = this.fly(b).hasClass(c);
					if (!c || a) {
						return this.getCellIndex(b)
					}
				}
				return false
			},
			getCellIndex : function (b) {
				if (b) {
					var a = b.className.match(this.colRe);
					if (a && a[1]) {
						return this.cm.getIndexById(a[1])
					}
				}
				return false
			},
			findHeaderCell : function (b) {
				var a = this.findCell(b);
				return a && this.fly(a).hasClass(this.hdCls) ? a : null
			},
			findHeaderIndex : function (a) {
				return this.findCellIndex(a, this.hdCls)
			},
			findRow : function (a) {
				if (!a) {
					return false
				}
				return this.fly(a).findParent(this.rowSelector, this.rowSelectorDepth)
			},
			findRowIndex : function (a) {
				var b = this.findRow(a);
				return b ? b.rowIndex : false
			},
			findRowBody : function (a) {
				if (!a) {
					return false
				}
				return this.fly(a).findParent(this.rowBodySelector, this.rowBodySelectorDepth)
			},
			getRow : function (a) {
				return this.getRows()[a]
			},
			getCell : function (b, a) {
				return Ext.fly(this.getRow(b)).query(this.cellSelector)[a]
			},
			getHeaderCell : function (a) {
				return this.mainHd.dom.getElementsByTagName("td")[a]
			},
			addRowClass : function (b, a) {
				var c = this.getRow(b);
				if (c) {
					this.fly(c).addClass(a)
				}
			},
			removeRowClass : function (c, a) {
				var b = this.getRow(c);
				if (b) {
					this.fly(b).removeClass(a)
				}
			},
			removeRow : function (a) {
				Ext.removeNode(this.getRow(a));
				this.syncFocusEl(a)
			},
			removeRows : function (c, a) {
				var b = this.mainBody.dom,
				d;
				for (d = c; d <= a; d++) {
					Ext.removeNode(b.childNodes[c])
				}
				this.syncFocusEl(c)
			},
			getScrollState : function () {
				var a = this.scroller.dom;
				return {
					left : a.scrollLeft,
					top : a.scrollTop
				}
			},
			restoreScroll : function (a) {
				var b = this.scroller.dom;
				b.scrollLeft = a.left;
				b.scrollTop = a.top
			},
			scrollToTop : function () {
				var a = this.scroller.dom;
				a.scrollTop = 0;
				a.scrollLeft = 0
			},
			syncScroll : function () {
				this.syncHeaderScroll();
				var a = this.scroller.dom;
				this.grid.fireEvent("bodyscroll", a.scrollLeft, a.scrollTop)
			},
			syncHeaderScroll : function () {
				var a = this.innerHd,
				b = this.scroller.dom.scrollLeft;
				a.scrollLeft = b;
				a.scrollLeft = b
			},
			updateSortIcon : function (d, c) {
				var a = this.sortClasses,
				b = a[c == "DESC" ? 1 : 0],
				e = this.mainHd.select("td").removeClass(a);
				e.item(d).addClass(b)
			},
			updateAllColumnWidths : function () {
				var e = this.getTotalWidth(),
				k = this.cm.getColumnCount(),
				m = this.getRows(),
				g = m.length,
				b = [],
				l,
				a,
				h,
				d,
				c;
				for (d = 0; d < k; d++) {
					b[d] = this.getColumnWidth(d);
					this.getHeaderCell(d).style.width = b[d]
				}
				this.updateHeaderWidth();
				for (d = 0; d < g; d++) {
					l = m[d];
					l.style.width = e;
					a = l.firstChild;
					if (a) {
						a.style.width = e;
						h = a.rows[0];
						for (c = 0; c < k; c++) {
							h.childNodes[c].style.width = b[c]
						}
					}
				}
				this.onAllColumnWidthsUpdated(b, e)
			},
			updateColumnWidth : function (d, b) {
				var c = this.getColumnWidth(d),
				j = this.getTotalWidth(),
				h = this.getHeaderCell(d),
				a = this.getRows(),
				e = a.length,
				l,
				g,
				k;
				this.updateHeaderWidth();
				h.style.width = c;
				for (g = 0; g < e; g++) {
					l = a[g];
					k = l.firstChild;
					l.style.width = j;
					if (k) {
						k.style.width = j;
						k.rows[0].childNodes[d].style.width = c
					}
				}
				this.onColumnWidthUpdated(d, c, j)
			},
			updateColumnHidden : function (b, j) {
				var h = this.getTotalWidth(),
				k = j ? "none" : "",
				g = this.getHeaderCell(b),
				a = this.getRows(),
				d = a.length,
				l,
				c,
				e;
				this.updateHeaderWidth();
				g.style.display = k;
				for (e = 0; e < d; e++) {
					l = a[e];
					l.style.width = h;
					c = l.firstChild;
					if (c) {
						c.style.width = h;
						c.rows[0].childNodes[b].style.display = k
					}
				}
				this.onColumnHiddenUpdated(b, j, h);
				delete this.lastViewWidth;
				this.layout()
			},
			doRender : function (d, v, m, a, r, t) {
				var h = this.templates,
				c = h.cell,
				y = h.row,
				o = r - 1,
				b = "width:" + this.getTotalWidth() + ";",
				k = [],
				l = [],
				n = {
					tstyle : b
				},
				q = {},
				w = v.length,
				x,
				g,
				e,
				u,
				s,
				p;
				for (s = 0; s < w; s++) {
					e = v[s];
					l = [];
					p = s + a;
					for (u = 0; u < r; u++) {
						g = d[u];
						q.id = g.id;
						q.css = u === 0 ? "x-grid3-cell-first " : (u == o ? "x-grid3-cell-last " : "");
						q.attr = q.cellAttr = "";
						q.style = g.style;
						q.value = g.renderer.call(g.scope, e.data[g.name], q, e, p, u, m);
						if (Ext.isEmpty(q.value)) {
							q.value = "&#160;"
						}
						if (this.markDirty && e.dirty && typeof e.modified[g.name] != "undefined") {
							q.css += " x-grid3-dirty-cell"
						}
						l[l.length] = c.apply(q)
					}
					x = [];
					if (t && ((p + 1) % 2 === 0)) {
						x[0] = "x-grid3-row-alt"
					}
					if (e.dirty) {
						x[1] = " x-grid3-dirty-row"
					}
					n.cols = r;
					if (this.getRowClass) {
						x[2] = this.getRowClass(e, p, n, m)
					}
					n.alt = x.join(" ");
					n.cells = l.join("");
					k[k.length] = y.apply(n)
				}
				return k.join("")
			},
			processRows : function (a, g) {
				if (!this.ds || this.ds.getCount() < 1) {
					return
				}
				var d = this.getRows(),
				c = d.length,
				e,
				b;
				g = g || !this.grid.stripeRows;
				a = a || 0;
				for (b = 0; b < c; b++) {
					e = d[b];
					if (e) {
						e.rowIndex = b;
						if (!g) {
							e.className = e.className.replace(this.rowClsRe, " ");
							if ((b + 1) % 2 === 0) {
								e.className += " x-grid3-row-alt"
							}
						}
					}
				}
				if (a === 0) {
					Ext.fly(d[0]).addClass(this.firstRowCls)
				}
				Ext.fly(d[c - 1]).addClass(this.lastRowCls)
			},
			afterRender : function () {
				if (!this.ds || !this.cm) {
					return
				}
				this.mainBody.dom.innerHTML = this.renderBody() || "&#160;";
				this.processRows(0, true);
				if (this.deferEmptyText !== true) {
					this.applyEmptyText()
				}
				this.grid.fireEvent("viewready", this.grid)
			},
			afterRenderUI : function () {
				var a = this.grid;
				this.initElements();
				Ext.fly(this.innerHd).on("click", this.handleHdDown, this);
				this.mainHd.on({
						scope : this,
						mouseover : this.handleHdOver,
						mouseout : this.handleHdOut,
						mousemove : this.handleHdMove
					});
				this.scroller.on("scroll", this.syncScroll, this);
				if (a.enableColumnResize !== false) {
					this.splitZone = new Ext.grid.GridView.SplitDragZone(a, this.mainHd.dom)
				}
				if (a.enableColumnMove) {
					this.columnDrag = new Ext.grid.GridView.ColumnDragZone(a, this.innerHd);
					this.columnDrop = new Ext.grid.HeaderDropZone(a, this.mainHd.dom)
				}
				if (a.enableHdMenu !== false) {
					this.hmenu = new Ext.menu.Menu({
								id : a.id + "-hctx"
							});
					this.hmenu.add({
							itemId : "asc",
							text : this.sortAscText,
							cls : "xg-hmenu-sort-asc"
						}, {
							itemId : "desc",
							text : this.sortDescText,
							cls : "xg-hmenu-sort-desc"
						});
					if (a.enableColumnHide !== false) {
						this.colMenu = new Ext.menu.Menu({
									id : a.id + "-hcols-menu"
								});
						this.colMenu.on({
								scope : this,
								beforeshow : this.beforeColMenuShow,
								itemclick : this.handleHdMenuClick
							});
						this.hmenu.add("-", {
								itemId : "columns",
								hideOnClick : false,
								text : this.columnsText,
								menu : this.colMenu,
								iconCls : "x-cols-icon"
							})
					}
					this.hmenu.on("itemclick", this.handleHdMenuClick, this)
				}
				if (a.trackMouseOver) {
					this.mainBody.on({
							scope : this,
							mouseover : this.onRowOver,
							mouseout : this.onRowOut
						})
				}
				if (a.enableDragDrop || a.enableDrag) {
					this.dragZone = new Ext.grid.GridDragZone(a, {
								ddGroup : a.ddGroup || "GridDD"
							})
				}
				this.updateHeaderSortState()
			},
			renderUI : function () {
				var a = this.templates;
				return a.master.apply({
						body : a.body.apply({
								rows : "&#160;"
							}),
						header : this.renderHeaders(),
						ostyle : "width:" + this.getOffsetWidth() + ";",
						bstyle : "width:" + this.getTotalWidth() + ";"
					})
			},
			processEvent : function (b, h) {
				var i = h.getTarget(),
				a = this.grid,
				d = this.findHeaderIndex(i),
				k,
				j,
				c,
				g;
				a.fireEvent(b, h);
				if (d !== false) {
					a.fireEvent("header" + b, a, d, h)
				} else {
					k = this.findRowIndex(i);
					if (k !== false) {
						j = this.findCellIndex(i);
						if (j !== false) {
							c = a.colModel.getColumnAt(j);
							if (a.fireEvent("cell" + b, a, k, j, h) !== false) {
								if (!c || (c.processEvent && (c.processEvent(b, h, a, k, j) !== false))) {
									a.fireEvent("row" + b, a, k, h)
								}
							}
						} else {
							if (a.fireEvent("row" + b, a, k, h) !== false) {
								(g = this.findRowBody(i)) && a.fireEvent("rowbody" + b, a, k, h)
							}
						}
					} else {
						a.fireEvent("container" + b, a, h)
					}
				}
			},
			layout : function (j) {
				if (!this.mainBody) {
					return
				}
				var a = this.grid,
				d = a.getGridEl(),
				c = d.getSize(true),
				i = c.width,
				b = c.height,
				h = this.scroller,
				g,
				e,
				k;
				if (i < 20 || b < 20) {
					return
				}
				if (a.autoHeight) {
					g = h.dom.style;
					g.overflow = "visible";
					if (Ext.isWebKit) {
						g.position = "static"
					}
				} else {
					this.el.setSize(i, b);
					e = this.mainHd.getHeight();
					k = b - e;
					h.setSize(i, k);
					if (this.innerHd) {
						this.innerHd.style.width = (i) + "px"
					}
				}
				if (this.forceFit || (j === true && this.autoFill)) {
					if (this.lastViewWidth != i) {
						this.fitColumns(false, false);
						this.lastViewWidth = i
					}
				} else {
					this.autoExpand();
					this.syncHeaderScroll()
				}
				this.onLayout(i, k)
			},
			onLayout : function (a, b) {},
			onColumnWidthUpdated : function (c, a, b) {},
			onAllColumnWidthsUpdated : function (a, b) {},
			onColumnHiddenUpdated : function (b, c, a) {},
			updateColumnText : function (a, b) {},
			afterMove : function (a) {},
			init : function (a) {
				this.grid = a;
				this.initTemplates();
				this.initData(a.store, a.colModel);
				this.initUI(a)
			},
			getColumnId : function (a) {
				return this.cm.getColumnId(a)
			},
			getOffsetWidth : function () {
				return (this.cm.getTotalWidth() + this.getScrollOffset()) + "px"
			},
			getScrollOffset : function () {
				return Ext.num(this.scrollOffset, Ext.getScrollBarWidth())
			},
			renderHeaders : function () {
				var e = this.cm,
				g = this.templates,
				a = g.hcell,
				d = {},
				h = e.getColumnCount(),
				j = h - 1,
				k = [],
				c,
				b;
				for (c = 0; c < h; c++) {
					if (c == 0) {
						b = "x-grid3-cell-first "
					} else {
						b = c == j ? "x-grid3-cell-last " : ""
					}
					d = {
						id : e.getColumnId(c),
						value : e.getColumnHeader(c) || "",
						style : this.getColumnStyle(c, true),
						css : b,
						tooltip : this.getColumnTooltip(c)
					};
					if (e.config[c].align == "right") {
						d.istyle = "padding-right: 16px;"
					} else {
						delete d.istyle
					}
					k[c] = a.apply(d)
				}
				return g.header.apply({
						cells : k.join(""),
						tstyle : String.format("width: {0};", this.getTotalWidth())
					})
			},
			getColumnTooltip : function (a) {
				var b = this.cm.getColumnTooltip(a);
				if (b) {
					if (Ext.QuickTips.isEnabled()) {
						return 'ext:qtip="' + b + '"'
					} else {
						return 'title="' + b + '"'
					}
				}
				return ""
			},
			beforeUpdate : function () {
				this.grid.stopEditing(true)
			},
			updateHeaders : function () {
				this.innerHd.firstChild.innerHTML = this.renderHeaders();
				this.updateHeaderWidth(false)
			},
			updateHeaderWidth : function (c) {
				var b = this.innerHd.firstChild,
				a = this.getTotalWidth();
				b.style.width = this.getOffsetWidth();
				b.firstChild.style.width = a;
				if (c !== false) {
					this.mainBody.dom.style.width = a
				}
			},
			focusRow : function (a) {
				this.focusCell(a, 0, false)
			},
			focusCell : function (d, b, c) {
				this.syncFocusEl(this.ensureVisible(d, b, c));
				var a = this.focusEl;
				if (Ext.isGecko) {
					a.focus()
				} else {
					a.focus.defer(1, a)
				}
			},
			resolveCell : function (h, d, g) {
				if (!Ext.isNumber(h)) {
					h = h.rowIndex
				}
				if (!this.ds) {
					return null
				}
				if (h < 0 || h >= this.ds.getCount()) {
					return null
				}
				d = (d !== undefined ? d : 0);
				var c = this.getRow(h),
				b = this.cm,
				e = b.getColumnCount(),
				a;
				if (!(g === false && d === 0)) {
					while (d < e && b.isHidden(d)) {
						d++
					}
					a = this.getCell(h, d)
				}
				return {
					row : c,
					cell : a
				}
			},
			getResolvedXY : function (b) {
				if (!b) {
					return null
				}
				var a = b.cell,
				c = b.row;
				if (a) {
					return Ext.fly(a).getXY()
				} else {
					return [this.el.getX(), Ext.fly(c).getY()]
				}
			},
			syncFocusEl : function (d, a, c) {
				var b = d;
				if (!Ext.isArray(b)) {
					d = Math.min(d, Math.max(0, this.getRows().length - 1));
					if (isNaN(d)) {
						return
					}
					b = this.getResolvedXY(this.resolveCell(d, a, c))
				}
				this.focusEl.setXY(b || this.scroller.getXY())
			},
			ensureVisible : function (t, g, e) {
				var r = this.resolveCell(t, g, e);
				if (!r || !r.row) {
					return null
				}
				var k = r.row,
				h = r.cell,
				n = this.scroller.dom,
				d = k,
				s = 0,
				o = this.el.dom;
				while (d && d != o) {
					s += d.offsetTop;
					d = d.offsetParent
				}
				s -= this.mainHd.dom.offsetHeight;
				o = parseInt(n.scrollTop, 10);
				var q = s + k.offsetHeight,
				a = n.clientHeight,
				m = o + a;
				if (s < o) {
					n.scrollTop = s
				} else {
					if (q > m) {
						n.scrollTop = q - a
					}
				}
				if (e !== false) {
					var l = parseInt(h.offsetLeft, 10),
					j = l + h.offsetWidth,
					i = parseInt(n.scrollLeft, 10),
					b = i + n.clientWidth;
					if (l < i) {
						n.scrollLeft = l
					} else {
						if (j > b) {
							n.scrollLeft = j - n.clientWidth
						}
					}
				}
				return this.getResolvedXY(r)
			},
			insertRows : function (a, i, e, h) {
				var d = a.getCount() - 1;
				if (!h && i === 0 && e >= d) {
					this.fireEvent("beforerowsinserted", this, i, e);
					this.refresh();
					this.fireEvent("rowsinserted", this, i, e)
				} else {
					if (!h) {
						this.fireEvent("beforerowsinserted", this, i, e)
					}
					var b = this.renderRows(i, e),
					g = this.getRow(i);
					if (g) {
						if (i === 0) {
							Ext.fly(this.getRow(0)).removeClass(this.firstRowCls)
						}
						Ext.DomHelper.insertHtml("beforeBegin", g, b)
					} else {
						var c = this.getRow(d - 1);
						if (c) {
							Ext.fly(c).removeClass(this.lastRowCls)
						}
						Ext.DomHelper.insertHtml("beforeEnd", this.mainBody.dom, b)
					}
					if (!h) {
						this.processRows(i);
						this.fireEvent("rowsinserted", this, i, e)
					} else {
						if (i === 0 || i >= d) {
							Ext.fly(this.getRow(i)).addClass(i === 0 ? this.firstRowCls : this.lastRowCls)
						}
					}
				}
				this.syncFocusEl(i)
			},
			deleteRows : function (a, c, b) {
				if (a.getRowCount() < 1) {
					this.refresh()
				} else {
					this.fireEvent("beforerowsdeleted", this, c, b);
					this.removeRows(c, b);
					this.processRows(c);
					this.fireEvent("rowsdeleted", this, c, b)
				}
			},
			getColumnStyle : function (b, d) {
				var a = this.cm,
				g = a.config,
				c = d ? "" : g[b].css || "",
				e = g[b].align;
				c += String.format("width: {0};", this.getColumnWidth(b));
				if (a.isHidden(b)) {
					c += "display: none; "
				}
				if (e) {
					c += String.format("text-align: {0};", e)
				}
				return c
			},
			getColumnWidth : function (b) {
				var c = this.cm.getColumnWidth(b),
				a = this.borderWidth;
				if (Ext.isNumber(c)) {
					if (Ext.isBorderBox || (Ext.isWebKit && !Ext.isSafari2)) {
						return c + "px"
					} else {
						return Math.max(c - a, 0) + "px"
					}
				} else {
					return c
				}
			},
			getTotalWidth : function () {
				return this.cm.getTotalWidth() + "px"
			},
			fitColumns : function (g, j, h) {
				var a = this.grid,
				l = this.cm,
				s = l.getTotalWidth(false),
				q = this.getGridInnerWidth(),
				r = q - s,
				c = [],
				o = 0,
				n = 0,
				u,
				d,
				p;
				if (q < 20 || r === 0) {
					return false
				}
				var e = l.getColumnCount(true),
				m = l.getColumnCount(false),
				b = e - (Ext.isNumber(h) ? 1 : 0);
				if (b === 0) {
					b = 1;
					h = undefined
				}
				for (p = 0; p < m; p++) {
					if (!l.isFixed(p) && p !== h) {
						u = l.getColumnWidth(p);
						c.push(p, u);
						if (!l.isHidden(p)) {
							o = p;
							n += u
						}
					}
				}
				d = (q - l.getTotalWidth()) / n;
				while (c.length) {
					u = c.pop();
					p = c.pop();
					l.setColumnWidth(p, Math.max(a.minColumnWidth, Math.floor(u + u * d)), true)
				}
				s = l.getTotalWidth(false);
				if (s > q) {
					var t = (b == e) ? o : h,
					k = Math.max(1, l.getColumnWidth(t) - (s - q));
					l.setColumnWidth(t, k, true)
				}
				if (g !== true) {
					this.updateAllColumnWidths()
				}
				return true
			},
			autoExpand : function (k) {
				var a = this.grid,
				i = this.cm,
				e = this.getGridInnerWidth(),
				c = i.getTotalWidth(false),
				g = a.autoExpandColumn;
				if (!this.userResized && g) {
					if (e != c) {
						var j = i.getIndexById(g),
						b = i.getColumnWidth(j),
						h = e - c + b,
						d = Math.min(Math.max(h, a.autoExpandMin), a.autoExpandMax);
						if (b != d) {
							i.setColumnWidth(j, d, true);
							if (k !== true) {
								this.updateColumnWidth(j, d)
							}
						}
					}
				}
			},
			getGridInnerWidth : function () {
				return this.grid.getGridEl().getWidth(true) - this.getScrollOffset()
			},
			getColumnData : function () {
				var e = [],
				c = this.cm,
				g = c.getColumnCount(),
				a = this.ds.fields,
				d,
				b;
				for (d = 0; d < g; d++) {
					b = c.getDataIndex(d);
					e[d] = {
						name : Ext.isDefined(b) ? b : (a.get(d) ? a.get(d).name : undefined),
						renderer : c.getRenderer(d),
						scope : c.getRendererScope(d),
						id : c.getColumnId(d),
						style : this.getColumnStyle(d)
					}
				}
				return e
			},
			renderRows : function (i, c) {
				var a = this.grid,
				g = a.store,
				j = a.stripeRows,
				e = a.colModel,
				h = e.getColumnCount(),
				d = g.getCount(),
				b;
				if (d < 1) {
					return ""
				}
				i = i || 0;
				c = Ext.isDefined(c) ? c : d - 1;
				b = g.getRange(i, c);
				return this.doRender(this.getColumnData(), b, g, i, h, j)
			},
			renderBody : function () {
				var a = this.renderRows() || "&#160;";
				return this.templates.body.apply({
						rows : a
					})
			},
			refreshRow : function (g) {
				var l = this.ds,
				m = this.cm.getColumnCount(),
				c = this.getColumnData(),
				n = m - 1,
				p = ["x-grid3-row"],
				e = {
					tstyle : String.format("width: {0};", this.getTotalWidth())
				},
				a = [],
				k = this.templates.cell,
				j,
				q,
				b,
				o,
				h,
				d;
				if (Ext.isNumber(g)) {
					j = g;
					g = l.getAt(j)
				} else {
					j = l.indexOf(g)
				}
				if (!g || j < 0) {
					return
				}
				for (d = 0; d < m; d++) {
					b = c[d];
					if (d == 0) {
						h = "x-grid3-cell-first"
					} else {
						h = (d == n) ? "x-grid3-cell-last " : ""
					}
					o = {
						id : b.id,
						style : b.style,
						css : h,
						attr : "",
						cellAttr : ""
					};
					o.value = b.renderer.call(b.scope, g.data[b.name], o, g, j, d, l);
					if (Ext.isEmpty(o.value)) {
						o.value = "&#160;"
					}
					if (this.markDirty && g.dirty && typeof g.modified[b.name] != "undefined") {
						o.css += " x-grid3-dirty-cell"
					}
					a[d] = k.apply(o)
				}
				q = this.getRow(j);
				q.className = "";
				if (this.grid.stripeRows && ((j + 1) % 2 === 0)) {
					p.push("x-grid3-row-alt")
				}
				if (this.getRowClass) {
					e.cols = m;
					p.push(this.getRowClass(g, j, e, l))
				}
				this.fly(q).addClass(p).setStyle(e.tstyle);
				e.cells = a.join("");
				q.innerHTML = this.templates.rowInner.apply(e);
				this.fireEvent("rowupdated", this, j, g)
			},
			refresh : function (b) {
				this.fireEvent("beforerefresh", this);
				this.grid.stopEditing(true);
				var a = this.renderBody();
				this.mainBody.update(a).setWidth(this.getTotalWidth());
				if (b === true) {
					this.updateHeaders();
					this.updateHeaderSortState()
				}
				this.processRows(0, true);
				this.layout();
				this.applyEmptyText();
				this.fireEvent("refresh", this)
			},
			applyEmptyText : function () {
				if (this.emptyText && !this.hasRows()) {
					this.mainBody.update('<div class="x-grid-empty">' + this.emptyText + "</div>")
				}
			},
			updateHeaderSortState : function () {
				var b = this.ds.getSortState();
				if (!b) {
					return
				}
				if (!this.sortState || (this.sortState.field != b.field || this.sortState.direction != b.direction)) {
					this.grid.fireEvent("sortchange", this.grid, b)
				}
				this.sortState = b;
				var c = this.cm.findColumnIndex(b.field);
				if (c != -1) {
					var a = b.direction;
					this.updateSortIcon(c, a)
				}
			},
			clearHeaderSortState : function () {
				if (!this.sortState) {
					return
				}
				this.grid.fireEvent("sortchange", this.grid, null);
				this.mainHd.select("td").removeClass(this.sortClasses);
				delete this.sortState
			},
			destroy : function () {
				var j = this,
				a = j.grid,
				d = a.getGridEl(),
				i = j.dragZone,
				g = j.splitZone,
				h = j.columnDrag,
				e = j.columnDrop,
				k = j.scrollToTopTask,
				c,
				b;
				if (k && k.cancel) {
					k.cancel()
				}
				Ext.destroyMembers(j, "colMenu", "hmenu");
				j.initData(null, null);
				j.purgeListeners();
				Ext.fly(j.innerHd).un("click", j.handleHdDown, j);
				if (a.enableColumnMove) {
					c = h.dragData;
					b = h.proxy;
					Ext.destroy(h.el, b.ghost, b.el, e.el, e.proxyTop, e.proxyBottom, c.ddel, c.header);
					if (b.anim) {
						Ext.destroy(b.anim)
					}
					delete b.ghost;
					delete c.ddel;
					delete c.header;
					h.destroy();
					delete Ext.dd.DDM.locationCache[h.id];
					delete h._domRef;
					delete e.proxyTop;
					delete e.proxyBottom;
					e.destroy();
					delete Ext.dd.DDM.locationCache["gridHeader" + d.id];
					delete e._domRef;
					delete Ext.dd.DDM.ids[e.ddGroup]
				}
				if (g) {
					g.destroy();
					delete g._domRef;
					delete Ext.dd.DDM.ids["gridSplitters" + d.id]
				}
				Ext.fly(j.innerHd).removeAllListeners();
				Ext.removeNode(j.innerHd);
				delete j.innerHd;
				Ext.destroy(j.el, j.mainWrap, j.mainHd, j.scroller, j.mainBody, j.focusEl, j.resizeMarker, j.resizeProxy, j.activeHdBtn, j._flyweight, i, g);
				delete a.container;
				if (i) {
					i.destroy()
				}
				Ext.dd.DDM.currentTarget = null;
				delete Ext.dd.DDM.locationCache[d.id];
				Ext.EventManager.removeResizeListener(j.onWindowResize, j)
			},
			onDenyColumnHide : function () {},
			render : function () {
				if (this.autoFill) {
					var a = this.grid.ownerCt;
					if (a && a.getLayout()) {
						a.on("afterlayout", function () {
								this.fitColumns(true, true);
								this.updateHeaders();
								this.updateHeaderSortState()
							}, this, {
								single : true
							})
					}
				} else {
					if (this.forceFit) {
						this.fitColumns(true, false)
					} else {
						if (this.grid.autoExpandColumn) {
							this.autoExpand(true)
						}
					}
				}
				this.grid.getGridEl().dom.innerHTML = this.renderUI();
				this.afterRenderUI()
			},
			initData : function (a, e) {
				var b = this;
				if (b.ds) {
					var d = b.ds;
					d.un("add", b.onAdd, b);
					d.un("load", b.onLoad, b);
					d.un("clear", b.onClear, b);
					d.un("remove", b.onRemove, b);
					d.un("update", b.onUpdate, b);
					d.un("datachanged", b.onDataChange, b);
					if (d !== a && d.autoDestroy) {
						d.destroy()
					}
				}
				if (a) {
					a.on({
							scope : b,
							load : b.onLoad,
							add : b.onAdd,
							remove : b.onRemove,
							update : b.onUpdate,
							clear : b.onClear,
							datachanged : b.onDataChange
						})
				}
				if (b.cm) {
					var c = b.cm;
					c.un("configchange", b.onColConfigChange, b);
					c.un("widthchange", b.onColWidthChange, b);
					c.un("headerchange", b.onHeaderChange, b);
					c.un("hiddenchange", b.onHiddenChange, b);
					c.un("columnmoved", b.onColumnMove, b)
				}
				if (e) {
					delete b.lastViewWidth;
					e.on({
							scope : b,
							configchange : b.onColConfigChange,
							widthchange : b.onColWidthChange,
							headerchange : b.onHeaderChange,
							hiddenchange : b.onHiddenChange,
							columnmoved : b.onColumnMove
						})
				}
				b.ds = a;
				b.cm = e
			},
			onDataChange : function () {
				this.refresh(true);
				this.updateHeaderSortState();
				this.syncFocusEl(0)
			},
			onClear : function () {
				this.refresh();
				this.syncFocusEl(0)
			},
			onUpdate : function (b, a) {
				this.refreshRow(a)
			},
			onAdd : function (b, a, c) {
				this.insertRows(b, c, c + (a.length - 1))
			},
			onRemove : function (b, a, c, d) {
				if (d !== true) {
					this.fireEvent("beforerowremoved", this, c, a)
				}
				this.removeRow(c);
				if (d !== true) {
					this.processRows(c);
					this.applyEmptyText();
					this.fireEvent("rowremoved", this, c, a)
				}
			},
			onLoad : function () {
				if (Ext.isGecko) {
					if (!this.scrollToTopTask) {
						this.scrollToTopTask = new Ext.util.DelayedTask(this.scrollToTop, this)
					}
					this.scrollToTopTask.delay(1)
				} else {
					this.scrollToTop()
				}
			},
			onColWidthChange : function (a, b, c) {
				this.updateColumnWidth(b, c)
			},
			onHeaderChange : function (a, b, c) {
				this.updateHeaders()
			},
			onHiddenChange : function (a, b, c) {
				this.updateColumnHidden(b, c)
			},
			onColumnMove : function (a, c, b) {
				this.indexMap = null;
				this.refresh(true);
				this.restoreScroll(this.getScrollState());
				this.afterMove(b);
				this.grid.fireEvent("columnmove", c, b)
			},
			onColConfigChange : function () {
				delete this.lastViewWidth;
				this.indexMap = null;
				this.refresh(true)
			},
			initUI : function (a) {
				a.on("headerclick", this.onHeaderClick, this)
			},
			initEvents : Ext.emptyFn,
			onHeaderClick : function (b, a) {
				if (this.headersDisabled || !this.cm.isSortable(a)) {
					return
				}
				b.stopEditing(true);
				b.store.sort(this.cm.getDataIndex(a))
			},
			onRowOver : function (b, a) {
				var c = this.findRowIndex(a);
				if (c !== false) {
					this.addRowClass(c, this.rowOverCls)
				}
			},
			onRowOut : function (b, a) {
				var c = this.findRowIndex(a);
				if (c !== false && !b.within(this.getRow(c), true)) {
					this.removeRowClass(c, this.rowOverCls)
				}
			},
			onRowSelect : function (a) {
				this.addRowClass(a, this.selectedRowClass)
			},
			onRowDeselect : function (a) {
				this.removeRowClass(a, this.selectedRowClass)
			},
			onCellSelect : function (c, b) {
				var a = this.getCell(c, b);
				if (a) {
					this.fly(a).addClass("x-grid3-cell-selected")
				}
			},
			onCellDeselect : function (c, b) {
				var a = this.getCell(c, b);
				if (a) {
					this.fly(a).removeClass("x-grid3-cell-selected")
				}
			},
			handleWheel : function (a) {
				a.stopPropagation()
			},
			onColumnSplitterMoved : function (a, b) {
				this.userResized = true;
				this.grid.colModel.setColumnWidth(a, b, true);
				if (this.forceFit) {
					this.fitColumns(true, false, a);
					this.updateAllColumnWidths()
				} else {
					this.updateColumnWidth(a, b);
					this.syncHeaderScroll()
				}
				this.grid.fireEvent("columnresize", a, b)
			},
			beforeColMenuShow : function () {
				var b = this.cm,
				d = b.getColumnCount(),
				a = this.colMenu,
				c;
				a.removeAll();
				for (c = 0; c < d; c++) {
					if (b.config[c].hideable !== false) {
						a.add(new Ext.menu.CheckItem({
									text : b.getColumnHeader(c),
									itemId : "col-" + b.getColumnId(c),
									checked : !b.isHidden(c),
									disabled : b.config[c].hideable === false,
									hideOnClick : false
								}))
					}
				}
			},
			handleHdMenuClick : function (c) {
				var a = this.ds,
				b = this.cm.getDataIndex(this.hdCtxIndex);
				switch (c.getItemId()) {
				case "asc":
					a.sort(b, "ASC");
					break;
				case "desc":
					a.sort(b, "DESC");
					break;
				default:
					this.handleHdMenuClickDefault(c)
				}
				return true
			},
			handleHdMenuClickDefault : function (c) {
				var b = this.cm,
				d = c.getItemId(),
				a = b.getIndexById(d.substr(4));
				if (a != -1) {
					if (c.checked && b.getColumnsBy(this.isHideableColumn, this).length <= 1) {
						this.onDenyColumnHide();
						return
					}
					b.setHidden(a, c.checked)
				}
			},
			handleHdDown : function (i, j) {
				if (Ext.fly(j).hasClass("x-grid3-hd-btn")) {
					i.stopEvent();
					var k = this.cm,
					g = this.findHeaderCell(j),
					h = this.getCellIndex(g),
					d = k.isSortable(h),
					c = this.hmenu,
					b = c.items,
					a = this.headerMenuOpenCls;
					this.hdCtxIndex = h;
					Ext.fly(g).addClass(a);
					b.get("asc").setDisabled(!d);
					b.get("desc").setDisabled(!d);
					c.on("hide", function () {
							Ext.fly(g).removeClass(a)
						}, this, {
							single : true
						});
					c.show(j, "tl-bl?")
				}
			},
			handleHdMove : function (k) {
				var i = this.findHeaderCell(this.activeHdRef);
				if (i && !this.headersDisabled) {
					var l = this.splitHandleWidth || 5,
					j = this.activeHdRegion,
					p = i.style,
					m = this.cm,
					o = "",
					g = k.getPageX();
					if (this.grid.enableColumnResize !== false) {
						var a = this.activeHdIndex,
						b = this.getPreviousVisible(a),
						n = m.isResizable(a),
						c = b && m.isResizable(b),
						d = g - j.left <= l,
						h = j.right - g <= (!this.activeHdBtn ? l : 2);
						if (d && c) {
							o = Ext.isAir ? "move" : Ext.isWebKit ? "e-resize" : "col-resize"
						} else {
							if (h && n) {
								o = Ext.isAir ? "move" : Ext.isWebKit ? "w-resize" : "col-resize"
							}
						}
					}
					p.cursor = o
				}
			},
			getPreviousVisible : function (a) {
				while (a > 0) {
					if (!this.cm.isHidden(a - 1)) {
						return a
					}
					a--
				}
				return undefined
			},
			handleHdOver : function (c, b) {
				var d = this.findHeaderCell(b);
				if (d && !this.headersDisabled) {
					var a = this.fly(d);
					this.activeHdRef = b;
					this.activeHdIndex = this.getCellIndex(d);
					this.activeHdRegion = a.getRegion();
					if (!this.isMenuDisabled(this.activeHdIndex, a)) {
						a.addClass("x-grid3-hd-over");
						this.activeHdBtn = a.child(".x-grid3-hd-btn");
						if (this.activeHdBtn) {
							this.activeHdBtn.dom.style.height = (d.firstChild.offsetHeight - 1) + "px"
						}
					}
				}
			},
			handleHdOut : function (b, a) {
				var c = this.findHeaderCell(a);
				if (c && (!Ext.isIE || !b.within(c, true))) {
					this.activeHdRef = null;
					this.fly(c).removeClass("x-grid3-hd-over");
					c.style.cursor = ""
				}
			},
			isMenuDisabled : function (a, b) {
				return this.cm.isMenuDisabled(a)
			},
			hasRows : function () {
				var a = this.mainBody.dom.firstChild;
				return a && a.nodeType == 1 && a.className != "x-grid-empty"
			},
			isHideableColumn : function (a) {
				return !a.hidden
			},
			bind : function (a, b) {
				this.initData(a, b)
			}
		});
Ext.grid.GridView.SplitDragZone = Ext.extend(Ext.dd.DDProxy, {
			constructor : function (a, b) {
				this.grid = a;
				this.view = a.getView();
				this.marker = this.view.resizeMarker;
				this.proxy = this.view.resizeProxy;
				Ext.grid.GridView.SplitDragZone.superclass.constructor.call(this, b, "gridSplitters" + this.grid.getGridEl().id, {
						dragElId : Ext.id(this.proxy.dom),
						resizeFrame : false
					});
				this.scroll = false;
				this.hw = this.view.splitHandleWidth || 5
			},
			b4StartDrag : function (a, e) {
				this.dragHeadersDisabled = this.view.headersDisabled;
				this.view.headersDisabled = true;
				var d = this.view.mainWrap.getHeight();
				this.marker.setHeight(d);
				this.marker.show();
				this.marker.alignTo(this.view.getHeaderCell(this.cellIndex), "tl-tl", [-2, 0]);
				this.proxy.setHeight(d);
				var b = this.cm.getColumnWidth(this.cellIndex),
				c = Math.max(b - this.grid.minColumnWidth, 0);
				this.resetConstraints();
				this.setXConstraint(c, 1000);
				this.setYConstraint(0, 0);
				this.minX = a - c;
				this.maxX = a + 1000;
				this.startPos = a;
				Ext.dd.DDProxy.prototype.b4StartDrag.call(this, a, e)
			},
			allowHeaderDrag : function (a) {
				return true
			},
			handleMouseDown : function (a) {
				var h = this.view.findHeaderCell(a.getTarget());
				if (h && this.allowHeaderDrag(a)) {
					var k = this.view.fly(h).getXY(),
					c = k[0],
					i = a.getXY(),
					b = i[0],
					g = h.offsetWidth,
					d = false;
					if ((b - c) <= this.hw) {
						d = -1
					} else {
						if ((c + g) - b <= this.hw) {
							d = 0
						}
					}
					if (d !== false) {
						this.cm = this.grid.colModel;
						var j = this.view.getCellIndex(h);
						if (d == -1) {
							if (j + d < 0) {
								return
							}
							while (this.cm.isHidden(j + d)) {
								--d;
								if (j + d < 0) {
									return
								}
							}
						}
						this.cellIndex = j + d;
						this.split = h.dom;
						if (this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)) {
							Ext.grid.GridView.SplitDragZone.superclass.handleMouseDown.apply(this, arguments)
						}
					} else {
						if (this.view.columnDrag) {
							this.view.columnDrag.callHandleMouseDown(a)
						}
					}
				}
			},
			endDrag : function (g) {
				this.marker.hide();
				var a = this.view,
				c = Math.max(this.minX, g.getPageX()),
				d = c - this.startPos,
				b = this.dragHeadersDisabled;
				a.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex) + d);
				setTimeout(function () {
						a.headersDisabled = b
					}, 50)
			},
			autoOffset : function () {
				this.setDelta(0, 0)
			}
		});
Ext.grid.PivotGridView = Ext.extend(Ext.grid.GridView, {
			colHeaderCellCls : "grid-hd-group-cell",
			title : "",
			getColumnHeaders : function () {
				return this.grid.topAxis.buildHeaders()
			},
			getRowHeaders : function () {
				return this.grid.leftAxis.buildHeaders()
			},
			renderRows : function (a, t) {
				var b = this.grid,
				o = b.extractData(),
				p = o.length,
				g = this.templates,
				s = b.renderer,
				h = typeof s == "function",
				w = this.getCellCls,
				n = typeof w == "function",
				d = g.cell,
				x = g.row,
				k = [],
				q = {},
				c = "width:" + this.getGridInnerWidth() + "px;",
				l,
				r,
				e,
				v,
				m;
				a = a || 0;
				t = Ext.isDefined(t) ? t : p - 1;
				for (v = 0; v < p; v++) {
					m = o[v];
					r = m.length;
					l = [];
					for (var u = 0; u < r; u++) {
						q.id = v + "-" + u;
						q.css = u === 0 ? "x-grid3-cell-first " : (u == (r - 1) ? "x-grid3-cell-last " : "");
						q.attr = q.cellAttr = "";
						q.value = m[u];
						if (Ext.isEmpty(q.value)) {
							q.value = "&#160;"
						}
						if (h) {
							q.value = s(q.value)
						}
						if (n) {
							q.css += w(q.value) + " "
						}
						l[l.length] = d.apply(q)
					}
					k[k.length] = x.apply({
								tstyle : c,
								cols : r,
								cells : l.join(""),
								alt : ""
							})
				}
				return k.join("")
			},
			masterTpl : new Ext.Template('<div class="x-grid3 x-pivotgrid" hidefocus="true">', '<div class="x-grid3-viewport">', '<div class="x-grid3-header">', '<div class="x-grid3-header-title"><span>{title}</span></div>', '<div class="x-grid3-header-inner">', '<div class="x-grid3-header-offset" style="{ostyle}"></div>', "</div>", '<div class="x-clear"></div>', "</div>", '<div class="x-grid3-scroller">', '<div class="x-grid3-row-headers"></div>', '<div class="x-grid3-body" style="{bstyle}">{body}</div>', '<a href="#" class="x-grid3-focus" tabIndex="-1"></a>', "</div>", "</div>", '<div class="x-grid3-resize-marker">&#160;</div>', '<div class="x-grid3-resize-proxy">&#160;</div>', "</div>"),
			initTemplates : function () {
				Ext.grid.PivotGridView.superclass.initTemplates.apply(this, arguments);
				var a = this.templates || {};
				if (!a.gcell) {
					a.gcell = new Ext.XTemplate('<td class="x-grid3-hd x-grid3-gcell x-grid3-td-{id} ux-grid-hd-group-row-{row} ' + this.colHeaderCellCls + '" style="{style}">', '<div {tooltip} class="x-grid3-hd-inner x-grid3-hd-{id}" unselectable="on" style="{istyle}">', this.grid.enableHdMenu ? '<a class="x-grid3-hd-btn" href="#"></a>' : "", "{value}", "</div>", "</td>")
				}
				this.templates = a;
				this.hrowRe = new RegExp("ux-grid-hd-group-row-(\\d+)", "")
			},
			initElements : function () {
				Ext.grid.PivotGridView.superclass.initElements.apply(this, arguments);
				this.rowHeadersEl = new Ext.Element(this.scroller.child("div.x-grid3-row-headers"));
				this.headerTitleEl = new Ext.Element(this.mainHd.child("div.x-grid3-header-title"))
			},
			getGridInnerWidth : function () {
				var a = Ext.grid.PivotGridView.superclass.getGridInnerWidth.apply(this, arguments);
				return a - this.getTotalRowHeaderWidth()
			},
			getTotalRowHeaderWidth : function () {
				var d = this.getRowHeaders(),
				c = d.length,
				b = 0,
				a;
				for (a = 0; a < c; a++) {
					b += d[a].width
				}
				return b
			},
			getTotalColumnHeaderHeight : function () {
				return this.getColumnHeaders().length * 21
			},
			getCellIndex : function (b) {
				if (b) {
					var a = b.className.match(this.colRe),
					c;
					if (a && (c = a[1])) {
						return parseInt(c.split("-")[1], 10)
					}
				}
				return false
			},
			renderUI : function () {
				var b = this.templates,
				a = this.getGridInnerWidth();
				return b.master.apply({
						body : b.body.apply({
								rows : "&#160;"
							}),
						ostyle : "width:" + a + "px",
						bstyle : "width:" + a + "px"
					})
			},
			onLayout : function (b, a) {
				Ext.grid.PivotGridView.superclass.onLayout.apply(this, arguments);
				var b = this.getGridInnerWidth();
				this.resizeColumnHeaders(b);
				this.resizeAllRows(b)
			},
			refresh : function (b) {
				this.fireEvent("beforerefresh", this);
				this.grid.stopEditing(true);
				var a = this.renderBody();
				this.mainBody.update(a).setWidth(this.getGridInnerWidth());
				if (b === true) {
					this.updateHeaders();
					this.updateHeaderSortState()
				}
				this.processRows(0, true);
				this.layout();
				this.applyEmptyText();
				this.fireEvent("refresh", this)
			},
			renderHeaders : Ext.emptyFn,
			fitColumns : Ext.emptyFn,
			resizeColumnHeaders : function (b) {
				var a = this.grid.topAxis;
				if (a.rendered) {
					a.el.setWidth(b)
				}
			},
			resizeRowHeaders : function () {
				var a = this.getTotalRowHeaderWidth(),
				b = String.format("margin-left: {0}px;", a);
				this.rowHeadersEl.setWidth(a);
				this.mainBody.applyStyles(b);
				Ext.fly(this.innerHd).applyStyles(b);
				this.headerTitleEl.setWidth(a);
				this.headerTitleEl.setHeight(this.getTotalColumnHeaderHeight())
			},
			resizeAllRows : function (b) {
				var d = this.getRows(),
				c = d.length,
				a;
				for (a = 0; a < c; a++) {
					Ext.fly(d[a]).setWidth(b);
					Ext.fly(d[a]).child("table").setWidth(b)
				}
			},
			updateHeaders : function () {
				this.renderGroupRowHeaders();
				this.renderGroupColumnHeaders()
			},
			renderGroupRowHeaders : function () {
				var a = this.grid.leftAxis;
				this.resizeRowHeaders();
				a.rendered = false;
				a.render(this.rowHeadersEl);
				this.setTitle(this.title)
			},
			setTitle : function (a) {
				this.headerTitleEl.child("span").dom.innerHTML = a
			},
			renderGroupColumnHeaders : function () {
				var a = this.grid.topAxis;
				a.rendered = false;
				a.render(this.innerHd.firstChild)
			},
			isMenuDisabled : function (a, b) {
				return true
			}
		});
Ext.grid.PivotAxis = Ext.extend(Ext.Component, {
			orientation : "horizontal",
			defaultHeaderWidth : 80,
			paddingWidth : 7,
			setDimensions : function (a) {
				this.dimensions = a
			},
			onRender : function (b, a) {
				var c = this.orientation == "horizontal" ? this.renderHorizontalRows() : this.renderVerticalRows();
				this.el = Ext.DomHelper.overwrite(b.dom, {
							tag : "table",
							cn : c
						}, true)
			},
			renderHorizontalRows : function () {
				var k = this.buildHeaders(),
				a = k.length,
				g = [],
				c,
				h,
				e,
				d,
				b;
				for (d = 0; d < a; d++) {
					c = [];
					h = k[d].items;
					e = h.length;
					for (b = 0; b < e; b++) {
						c.push({
								tag : "td",
								html : h[b].header,
								colspan : h[b].span
							})
					}
					g[d] = {
						tag : "tr",
						cn : c
					}
				}
				return g
			},
			renderVerticalRows : function () {
				var b = this.buildHeaders(),
				k = b.length,
				a = [],
				m = [],
				h,
				c,
				l,
				g,
				e,
				d;
				for (e = 0; e < k; e++) {
					c = b[e];
					g = c.width || 80;
					h = c.items.length;
					for (d = 0; d < h; d++) {
						l = c.items[d];
						a[l.start] = a[l.start] || [];
						a[l.start].push({
								tag : "td",
								html : l.header,
								rowspan : l.span,
								width : Ext.isBorderBox ? g : g - this.paddingWidth
							})
					}
				}
				h = a.length;
				for (e = 0; e < h; e++) {
					m[e] = {
						tag : "tr",
						cn : a[e]
					}
				}
				return m
			},
			getTuples : function () {
				var b = new Ext.data.Store({});
				b.data = this.store.data.clone();
				b.fields = this.store.fields;
				var l = [],
				a = this.dimensions,
				c = a.length,
				j;
				for (j = 0; j < c; j++) {
					l.push({
							field : a[j].dataIndex,
							direction : a[j].direction || "ASC"
						})
				}
				b.sort(l);
				var e = b.data.items,
				n = [],
				k = [],
				o,
				h,
				d,
				g,
				m;
				c = e.length;
				for (j = 0; j < c; j++) {
					d = this.getRecordInfo(e[j]);
					g = d.data;
					h = "";
					for (m in g) {
						h += g[m] + "---"
					}
					if (n.indexOf(h) == -1) {
						n.push(h);
						k.push(d)
					}
				}
				b.destroy();
				return k
			},
			getRecordInfo : function (a) {
				var e = this.dimensions,
				d = e.length,
				h = {},
				j,
				c,
				b;
				for (b = 0; b < d; b++) {
					j = e[b];
					c = j.dataIndex;
					h[c] = a.get(c)
				}
				var g = function (i) {
					return function (k) {
						for (var l in i) {
							if (k.get(l) != i[l]) {
								return false
							}
						}
						return true
					}
				};
				return {
					data : h,
					matcher : g(h)
				}
			},
			buildHeaders : function () {
				var l = this.getTuples(),
				m = l.length,
				a = this.dimensions,
				e,
				r = a.length,
				c = [],
				o,
				s,
				n,
				q,
				p,
				b,
				k,
				h,
				g,
				d;
				for (g = 0; g < r; g++) {
					e = a[g];
					s = [];
					p = 0;
					b = 0;
					for (d = 0; d < m; d++) {
						o = l[d];
						k = d == (m - 1);
						n = o.data[e.dataIndex];
						h = q != undefined && q != n;
						if (g > 0 && d > 0) {
							h = h || o.data[a[g - 1].dataIndex] != l[d - 1].data[a[g - 1].dataIndex]
						}
						if (h) {
							s.push({
									header : q,
									span : p,
									start : b
								});
							b += p;
							p = 0
						}
						if (k) {
							s.push({
									header : n,
									span : p + 1,
									start : b
								});
							b += p;
							p = 0
						}
						q = n;
						p++
					}
					c.push({
							items : s,
							width : e.width || this.defaultHeaderWidth
						});
					q = undefined
				}
				return c
			}
		});
Ext.grid.HeaderDragZone = Ext.extend(Ext.dd.DragZone, {
			maxDragWidth : 120,
			constructor : function (a, c, b) {
				this.grid = a;
				this.view = a.getView();
				this.ddGroup = "gridHeader" + this.grid.getGridEl().id;
				Ext.grid.HeaderDragZone.superclass.constructor.call(this, c);
				if (b) {
					this.setHandleElId(Ext.id(c));
					this.setOuterHandleElId(Ext.id(b))
				}
				this.scroll = false
			},
			getDragData : function (c) {
				var a = Ext.lib.Event.getTarget(c),
				b = this.view.findHeaderCell(a);
				if (b) {
					return {
						ddel : b.firstChild,
						header : b
					}
				}
				return false
			},
			onInitDrag : function (a) {
				this.dragHeadersDisabled = this.view.headersDisabled;
				this.view.headersDisabled = true;
				var b = this.dragData.ddel.cloneNode(true);
				b.id = Ext.id();
				b.style.width = Math.min(this.dragData.header.offsetWidth, this.maxDragWidth) + "px";
				this.proxy.update(b);
				return true
			},
			afterValidDrop : function () {
				this.completeDrop()
			},
			afterInvalidDrop : function () {
				this.completeDrop()
			},
			completeDrop : function () {
				var a = this.view,
				b = this.dragHeadersDisabled;
				setTimeout(function () {
						a.headersDisabled = b
					}, 50)
			}
		});
Ext.grid.HeaderDropZone = Ext.extend(Ext.dd.DropZone, {
			proxyOffsets : [-4, -9],
			fly : Ext.Element.fly,
			constructor : function (a, c, b) {
				this.grid = a;
				this.view = a.getView();
				this.proxyTop = Ext.DomHelper.append(document.body, {
							cls : "col-move-top",
							html : "&#160;"
						}, true);
				this.proxyBottom = Ext.DomHelper.append(document.body, {
							cls : "col-move-bottom",
							html : "&#160;"
						}, true);
				this.proxyTop.hide = this.proxyBottom.hide = function () {
					this.setLeftTop(-100, -100);
					this.setStyle("visibility", "hidden")
				};
				this.ddGroup = "gridHeader" + this.grid.getGridEl().id;
				Ext.grid.HeaderDropZone.superclass.constructor.call(this, a.getGridEl().dom)
			},
			getTargetFromEvent : function (c) {
				var a = Ext.lib.Event.getTarget(c),
				b = this.view.findCellIndex(a);
				if (b !== false) {
					return this.view.getHeaderCell(b)
				}
			},
			nextVisible : function (c) {
				var b = this.view,
				a = this.grid.colModel;
				c = c.nextSibling;
				while (c) {
					if (!a.isHidden(b.getCellIndex(c))) {
						return c
					}
					c = c.nextSibling
				}
				return null
			},
			prevVisible : function (c) {
				var b = this.view,
				a = this.grid.colModel;
				c = c.prevSibling;
				while (c) {
					if (!a.isHidden(b.getCellIndex(c))) {
						return c
					}
					c = c.prevSibling
				}
				return null
			},
			positionIndicator : function (d, k, j) {
				var a = Ext.lib.Event.getPageX(j),
				g = Ext.lib.Dom.getRegion(k.firstChild),
				c,
				i,
				b = g.top + this.proxyOffsets[1];
				if ((g.right - a) <= (g.right - g.left) / 2) {
					c = g.right + this.view.borderWidth;
					i = "after"
				} else {
					c = g.left;
					i = "before"
				}
				if (this.grid.colModel.isFixed(this.view.getCellIndex(k))) {
					return false
				}
				c += this.proxyOffsets[0];
				this.proxyTop.setLeftTop(c, b);
				this.proxyTop.show();
				if (!this.bottomOffset) {
					this.bottomOffset = this.view.mainHd.getHeight()
				}
				this.proxyBottom.setLeftTop(c, b + this.proxyTop.dom.offsetHeight + this.bottomOffset);
				this.proxyBottom.show();
				return i
			},
			onNodeEnter : function (d, a, c, b) {
				if (b.header != d) {
					this.positionIndicator(b.header, d, c)
				}
			},
			onNodeOver : function (g, b, d, c) {
				var a = false;
				if (c.header != g) {
					a = this.positionIndicator(c.header, g, d)
				}
				if (!a) {
					this.proxyTop.hide();
					this.proxyBottom.hide()
				}
				return a ? this.dropAllowed : this.dropNotAllowed
			},
			onNodeOut : function (d, a, c, b) {
				this.proxyTop.hide();
				this.proxyBottom.hide()
			},
			onNodeDrop : function (b, m, g, c) {
				var d = c.header;
				if (d != b) {
					var k = this.grid.colModel,
					j = Ext.lib.Event.getPageX(g),
					a = Ext.lib.Dom.getRegion(b.firstChild),
					o = (a.right - j) <= ((a.right - a.left) / 2) ? "after" : "before",
					i = this.view.getCellIndex(d),
					l = this.view.getCellIndex(b);
					if (o == "after") {
						l++
					}
					if (i < l) {
						l--
					}
					k.moveColumn(i, l);
					return true
				}
				return false
			}
		});
Ext.grid.GridView.ColumnDragZone = Ext.extend(Ext.grid.HeaderDragZone, {
			constructor : function (a, b) {
				Ext.grid.GridView.ColumnDragZone.superclass.constructor.call(this, a, b, null);
				this.proxy.el.addClass("x-grid3-col-dd")
			},
			handleMouseDown : function (a) {},
			callHandleMouseDown : function (a) {
				Ext.grid.GridView.ColumnDragZone.superclass.handleMouseDown.call(this, a)
			}
		});
Ext.grid.SplitDragZone = Ext.extend(Ext.dd.DDProxy, {
			fly : Ext.Element.fly,
			constructor : function (a, c, b) {
				this.grid = a;
				this.view = a.getView();
				this.proxy = this.view.resizeProxy;
				Ext.grid.SplitDragZone.superclass.constructor.call(this, c, "gridSplitters" + this.grid.getGridEl().id, {
						dragElId : Ext.id(this.proxy.dom),
						resizeFrame : false
					});
				this.setHandleElId(Ext.id(c));
				this.setOuterHandleElId(Ext.id(b));
				this.scroll = false
			},
			b4StartDrag : function (a, d) {
				this.view.headersDisabled = true;
				this.proxy.setHeight(this.view.mainWrap.getHeight());
				var b = this.cm.getColumnWidth(this.cellIndex);
				var c = Math.max(b - this.grid.minColumnWidth, 0);
				this.resetConstraints();
				this.setXConstraint(c, 1000);
				this.setYConstraint(0, 0);
				this.minX = a - c;
				this.maxX = a + 1000;
				this.startPos = a;
				Ext.dd.DDProxy.prototype.b4StartDrag.call(this, a, d)
			},
			handleMouseDown : function (c) {
				var b = Ext.EventObject.setEvent(c);
				var a = this.fly(b.getTarget());
				if (a.hasClass("x-grid-split")) {
					this.cellIndex = this.view.getCellIndex(a.dom);
					this.split = a.dom;
					this.cm = this.grid.colModel;
					if (this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)) {
						Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this, arguments)
					}
				}
			},
			endDrag : function (c) {
				this.view.headersDisabled = false;
				var a = Math.max(this.minX, Ext.lib.Event.getPageX(c));
				var b = a - this.startPos;
				this.view.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex) + b)
			},
			autoOffset : function () {
				this.setDelta(0, 0)
			}
		});
Ext.grid.GridDragZone = function (b, a) {
	this.view = b.getView();
	Ext.grid.GridDragZone.superclass.constructor.call(this, this.view.mainBody.dom, a);
	this.scroll = false;
	this.grid = b;
	this.ddel = document.createElement("div");
	this.ddel.className = "x-grid-dd-wrap"
};
Ext.extend(Ext.grid.GridDragZone, Ext.dd.DragZone, {
		ddGroup : "GridDD",
		getDragData : function (b) {
			var a = Ext.lib.Event.getTarget(b);
			var d = this.view.findRowIndex(a);
			if (d !== false) {
				var c = this.grid.selModel;
				if (!c.isSelected(d) || b.hasModifier()) {
					c.handleMouseDown(this.grid, d, b)
				}
				return {
					grid : this.grid,
					ddel : this.ddel,
					rowIndex : d,
					selections : c.getSelections()
				}
			}
			return false
		},
		onInitDrag : function (b) {
			var a = this.dragData;
			this.ddel.innerHTML = this.grid.getDragDropText();
			this.proxy.update(this.ddel)
		},
		afterRepair : function () {
			this.dragging = false
		},
		getRepairXY : function (b, a) {
			return false
		},
		onEndDrag : function (a, b) {},
		onValidDrop : function (a, b, c) {
			this.hideProxy()
		},
		beforeInvalidDrop : function (a, b) {}
		
	});
Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, {
			defaultWidth : 100,
			defaultSortable : false,
			constructor : function (a) {
				if (a.columns) {
					Ext.apply(this, a);
					this.setConfig(a.columns, true)
				} else {
					this.setConfig(a, true)
				}
				this.addEvents("widthchange", "headerchange", "hiddenchange", "columnmoved", "configchange");
				Ext.grid.ColumnModel.superclass.constructor.call(this)
			},
			getColumnId : function (a) {
				return this.config[a].id
			},
			getColumnAt : function (a) {
				return this.config[a]
			},
			setConfig : function (d, b) {
				var e,
				h,
				a;
				if (!b) {
					delete this.totalWidth;
					for (e = 0, a = this.config.length; e < a; e++) {
						h = this.config[e];
						if (h.setEditor) {
							h.setEditor(null)
						}
					}
				}
				this.defaults = Ext.apply({
							width : this.defaultWidth,
							sortable : this.defaultSortable
						}, this.defaults);
				this.config = d;
				this.lookup = {};
				for (e = 0, a = d.length; e < a; e++) {
					h = Ext.applyIf(d[e], this.defaults);
					if (Ext.isEmpty(h.id)) {
						h.id = e
					}
					if (!h.isColumn) {
						var g = Ext.grid.Column.types[h.xtype || "gridcolumn"];
						h = new g(h);
						d[e] = h
					}
					this.lookup[h.id] = h
				}
				if (!b) {
					this.fireEvent("configchange", this)
				}
			},
			getColumnById : function (a) {
				return this.lookup[a]
			},
			getIndexById : function (c) {
				for (var b = 0, a = this.config.length; b < a; b++) {
					if (this.config[b].id == c) {
						return b
					}
				}
				return -1
			},
			moveColumn : function (e, b) {
				var a = this.config,
				d = a[e];
				a.splice(e, 1);
				a.splice(b, 0, d);
				this.dataMap = null;
				this.fireEvent("columnmoved", this, e, b)
			},
			getColumnCount : function (b) {
				var d = this.config.length,
				e = 0,
				a;
				if (b === true) {
					for (a = 0; a < d; a++) {
						if (!this.isHidden(a)) {
							e++
						}
					}
					return e
				}
				return d
			},
			getColumnsBy : function (g, e) {
				var b = this.config,
				h = b.length,
				a = [],
				d,
				j;
				for (d = 0; d < h; d++) {
					j = b[d];
					if (g.call(e || this, j, d) === true) {
						a[a.length] = j
					}
				}
				return a
			},
			isSortable : function (a) {
				return !!this.config[a].sortable
			},
			isMenuDisabled : function (a) {
				return !!this.config[a].menuDisabled
			},
			getRenderer : function (a) {
				return this.config[a].renderer || Ext.grid.ColumnModel.defaultRenderer
			},
			getRendererScope : function (a) {
				return this.config[a].scope
			},
			setRenderer : function (a, b) {
				this.config[a].renderer = b
			},
			getColumnWidth : function (a) {
				var b = this.config[a].width;
				if (typeof b != "number") {
					b = this.defaultWidth
				}
				return b
			},
			setColumnWidth : function (b, c, a) {
				this.config[b].width = c;
				this.totalWidth = null;
				if (!a) {
					this.fireEvent("widthchange", this, b, c)
				}
			},
			getTotalWidth : function (b) {
				if (!this.totalWidth) {
					this.totalWidth = 0;
					for (var c = 0, a = this.config.length; c < a; c++) {
						if (b || !this.isHidden(c)) {
							this.totalWidth += this.getColumnWidth(c)
						}
					}
				}
				return this.totalWidth
			},
			getColumnHeader : function (a) {
				return this.config[a].header
			},
			setColumnHeader : function (a, b) {
				this.config[a].header = b;
				this.fireEvent("headerchange", this, a, b)
			},
			getColumnTooltip : function (a) {
				return this.config[a].tooltip
			},
			setColumnTooltip : function (a, b) {
				this.config[a].tooltip = b
			},
			getDataIndex : function (a) {
				return this.config[a].dataIndex
			},
			setDataIndex : function (a, b) {
				this.config[a].dataIndex = b
			},
			findColumnIndex : function (d) {
				var e = this.config;
				for (var b = 0, a = e.length; b < a; b++) {
					if (e[b].dataIndex == d) {
						return b
					}
				}
				return -1
			},
			isCellEditable : function (b, e) {
				var d = this.config[b],
				a = d.editable;
				return !!(a || (!Ext.isDefined(a) && d.editor))
			},
			getCellEditor : function (a, b) {
				return this.config[a].getCellEditor(b)
			},
			setEditable : function (a, b) {
				this.config[a].editable = b
			},
			isHidden : function (a) {
				return !!this.config[a].hidden
			},
			isFixed : function (a) {
				return !!this.config[a].fixed
			},
			isResizable : function (a) {
				return a >= 0 && this.config[a].resizable !== false && this.config[a].fixed !== true
			},
			setHidden : function (a, b) {
				var d = this.config[a];
				if (d.hidden !== b) {
					d.hidden = b;
					this.totalWidth = null;
					this.fireEvent("hiddenchange", this, a, b)
				}
			},
			setEditor : function (a, b) {
				this.config[a].setEditor(b)
			},
			destroy : function () {
				var b = this.config.length,
				a = 0;
				for (; a < b; a++) {
					this.config[a].destroy()
				}
				delete this.config;
				delete this.lookup;
				this.purgeListeners()
			},
			setState : function (a, b) {
				b = Ext.applyIf(b, this.defaults);
				Ext.apply(this.config[a], b)
			}
		});
Ext.grid.ColumnModel.defaultRenderer = function (a) {
	if (typeof a == "string" && a.length < 1) {
		return "&#160;"
	}
	return a
};
Ext.grid.AbstractSelectionModel = Ext.extend(Ext.util.Observable, {
			constructor : function () {
				this.locked = false;
				Ext.grid.AbstractSelectionModel.superclass.constructor.call(this)
			},
			init : function (a) {
				this.grid = a;
				if (this.lockOnInit) {
					delete this.lockOnInit;
					this.locked = false;
					this.lock()
				}
				this.initEvents()
			},
			lock : function () {
				if (!this.locked) {
					this.locked = true;
					var a = this.grid;
					if (a) {
						a.getView().on({
								scope : this,
								beforerefresh : this.sortUnLock,
								refresh : this.sortLock
							})
					} else {
						this.lockOnInit = true
					}
				}
			},
			sortLock : function () {
				this.locked = true
			},
			sortUnLock : function () {
				this.locked = false
			},
			unlock : function () {
				if (this.locked) {
					this.locked = false;
					var a = this.grid,
					b;
					if (a) {
						b = a.getView();
						b.un("beforerefresh", this.sortUnLock, this);
						b.un("refresh", this.sortLock, this)
					} else {
						delete this.lockOnInit
					}
				}
			},
			isLocked : function () {
				return this.locked
			},
			destroy : function () {
				this.unlock();
				this.purgeListeners()
			}
		});
Ext.grid.RowSelectionModel = Ext.extend(Ext.grid.AbstractSelectionModel, {
			singleSelect : false,
			constructor : function (a) {
				Ext.apply(this, a);
				this.selections = new Ext.util.MixedCollection(false, function (b) {
							return b.id
						});
				this.last = false;
				this.lastActive = false;
				this.addEvents("selectionchange", "beforerowselect", "rowselect", "rowdeselect");
				Ext.grid.RowSelectionModel.superclass.constructor.call(this)
			},
			initEvents : function () {
				if (!this.grid.enableDragDrop && !this.grid.enableDrag) {
					this.grid.on("rowmousedown", this.handleMouseDown, this)
				}
				this.rowNav = new Ext.KeyNav(this.grid.getGridEl(), {
							up : this.onKeyPress,
							down : this.onKeyPress,
							scope : this
						});
				this.grid.getView().on({
						scope : this,
						refresh : this.onRefresh,
						rowupdated : this.onRowUpdated,
						rowremoved : this.onRemove
					})
			},
			onKeyPress : function (g, b) {
				var a = b == "up",
				h = a ? "selectPrevious" : "selectNext",
				d = a ? -1 : 1,
				c;
				if (!g.shiftKey || this.singleSelect) {
					this[h](false)
				} else {
					if (this.last !== false && this.lastActive !== false) {
						c = this.last;
						this.selectRange(this.last, this.lastActive + d);
						this.grid.getView().focusRow(this.lastActive);
						if (c !== false) {
							this.last = c
						}
					} else {
						this.selectFirstRow()
					}
				}
			},
			onRefresh : function () {
				var g = this.grid.store,
				d = this.getSelections(),
				c = 0,
				a = d.length,
				b,
				e;
				this.silent = true;
				this.clearSelections(true);
				for (; c < a; c++) {
					e = d[c];
					if ((b = g.indexOfId(e.id)) != -1) {
						this.selectRow(b, true)
					}
				}
				if (d.length != this.selections.getCount()) {
					this.fireEvent("selectionchange", this)
				}
				this.silent = false
			},
			onRemove : function (a, b, c) {
				if (this.selections.remove(c) !== false) {
					this.fireEvent("selectionchange", this)
				}
			},
			onRowUpdated : function (a, b, c) {
				if (this.isSelected(c)) {
					a.onRowSelect(b)
				}
			},
			selectRecords : function (b, e) {
				if (!e) {
					this.clearSelections()
				}
				var d = this.grid.store,
				c = 0,
				a = b.length;
				for (; c < a; c++) {
					this.selectRow(d.indexOf(b[c]), true)
				}
			},
			getCount : function () {
				return this.selections.length
			},
			selectFirstRow : function () {
				this.selectRow(0)
			},
			selectLastRow : function (a) {
				this.selectRow(this.grid.store.getCount() - 1, a)
			},
			selectNext : function (a) {
				if (this.hasNext()) {
					this.selectRow(this.last + 1, a);
					this.grid.getView().focusRow(this.last);
					return true
				}
				return false
			},
			selectPrevious : function (a) {
				if (this.hasPrevious()) {
					this.selectRow(this.last - 1, a);
					this.grid.getView().focusRow(this.last);
					return true
				}
				return false
			},
			hasNext : function () {
				return this.last !== false && (this.last + 1) < this.grid.store.getCount()
			},
			hasPrevious : function () {
				return !!this.last
			},
			getSelections : function () {
				return [].concat(this.selections.items)
			},
			getSelected : function () {
				return this.selections.itemAt(0)
			},
			each : function (e, d) {
				var c = this.getSelections(),
				b = 0,
				a = c.length;
				for (; b < a; b++) {
					if (e.call(d || this, c[b], b) === false) {
						return false
					}
				}
				return true
			},
			clearSelections : function (a) {
				if (this.isLocked()) {
					return
				}
				if (a !== true) {
					var c = this.grid.store,
					b = this.selections;
					b.each(function (d) {
							this.deselectRow(c.indexOfId(d.id))
						}, this);
					b.clear()
				} else {
					this.selections.clear()
				}
				this.last = false
			},
			selectAll : function () {
				if (this.isLocked()) {
					return
				}
				this.selections.clear();
				for (var b = 0, a = this.grid.store.getCount(); b < a; b++) {
					this.selectRow(b, true)
				}
			},
			hasSelection : function () {
				return this.selections.length > 0
			},
			isSelected : function (a) {
				var b = Ext.isNumber(a) ? this.grid.store.getAt(a) : a;
				return (b && this.selections.key(b.id) ? true : false)
			},
			isIdSelected : function (a) {
				return (this.selections.key(a) ? true : false)
			},
			handleMouseDown : function (d, i, h) {
				if (h.button !== 0 || this.isLocked()) {
					return
				}
				var a = this.grid.getView();
				if (h.shiftKey && !this.singleSelect && this.last !== false) {
					var c = this.last;
					this.selectRange(c, i, h.ctrlKey);
					this.last = c;
					a.focusRow(i)
				} else {
					var b = this.isSelected(i);
					if (h.ctrlKey && b) {
						this.deselectRow(i)
					} else {
						if (!b || this.getCount() > 1) {
							this.selectRow(i, h.ctrlKey || h.shiftKey);
							a.focusRow(i)
						}
					}
				}
			},
			selectRows : function (c, d) {
				if (!d) {
					this.clearSelections()
				}
				for (var b = 0, a = c.length; b < a; b++) {
					this.selectRow(c[b], true)
				}
			},
			selectRange : function (b, a, d) {
				var c;
				if (this.isLocked()) {
					return
				}
				if (!d) {
					this.clearSelections()
				}
				if (b <= a) {
					for (c = b; c <= a; c++) {
						this.selectRow(c, true)
					}
				} else {
					for (c = b; c >= a; c--) {
						this.selectRow(c, true)
					}
				}
			},
			deselectRange : function (c, b, a) {
				if (this.isLocked()) {
					return
				}
				for (var d = c; d <= b; d++) {
					this.deselectRow(d, a)
				}
			},
			selectRow : function (b, d, a) {
				if (this.isLocked() || (b < 0 || b >= this.grid.store.getCount()) || (d && this.isSelected(b))) {
					return
				}
				var c = this.grid.store.getAt(b);
				if (c && this.fireEvent("beforerowselect", this, b, d, c) !== false) {
					if (!d || this.singleSelect) {
						this.clearSelections()
					}
					this.selections.add(c);
					this.last = this.lastActive = b;
					if (!a) {
						this.grid.getView().onRowSelect(b)
					}
					if (!this.silent) {
						this.fireEvent("rowselect", this, b, c);
						this.fireEvent("selectionchange", this)
					}
				}
			},
			deselectRow : function (b, a) {
				if (this.isLocked()) {
					return
				}
				if (this.last == b) {
					this.last = false
				}
				if (this.lastActive == b) {
					this.lastActive = false
				}
				var c = this.grid.store.getAt(b);
				if (c) {
					this.selections.remove(c);
					if (!a) {
						this.grid.getView().onRowDeselect(b)
					}
					this.fireEvent("rowdeselect", this, b, c);
					this.fireEvent("selectionchange", this)
				}
			},
			acceptsNav : function (c, b, a) {
				return !a.isHidden(b) && a.isCellEditable(b, c)
			},
			onEditorKey : function (n, l) {
				var d = l.getKey(),
				h,
				i = this.grid,
				p = i.lastEdit,
				j = i.activeEditor,
				b = l.shiftKey,
				o,
				p,
				a,
				m;
				if (d == l.TAB) {
					l.stopEvent();
					j.completeEdit();
					if (b) {
						h = i.walkCells(j.row, j.col - 1, -1, this.acceptsNav, this)
					} else {
						h = i.walkCells(j.row, j.col + 1, 1, this.acceptsNav, this)
					}
				} else {
					if (d == l.ENTER) {
						if (this.moveEditorOnEnter !== false) {
							if (b) {
								h = i.walkCells(p.row - 1, p.col, -1, this.acceptsNav, this)
							} else {
								h = i.walkCells(p.row + 1, p.col, 1, this.acceptsNav, this)
							}
						}
					}
				}
				if (h) {
					a = h[0];
					m = h[1];
					this.onEditorSelect(a, p.row);
					if (i.isEditor && i.editing) {
						o = i.activeEditor;
						if (o && o.field.triggerBlur) {
							o.field.triggerBlur()
						}
					}
					i.startEditing(a, m)
				}
			},
			onEditorSelect : function (b, a) {
				if (a != b) {
					this.selectRow(b)
				}
			},
			destroy : function () {
				Ext.destroy(this.rowNav);
				this.rowNav = null;
				Ext.grid.RowSelectionModel.superclass.destroy.call(this)
			}
		});
Ext.grid.Column = Ext.extend(Ext.util.Observable, {
			isColumn : true,
			constructor : function (b) {
				Ext.apply(this, b);
				if (Ext.isString(this.renderer)) {
					this.renderer = Ext.util.Format[this.renderer]
				} else {
					if (Ext.isObject(this.renderer)) {
						this.scope = this.renderer.scope;
						this.renderer = this.renderer.fn
					}
				}
				if (!this.scope) {
					this.scope = this
				}
				var a = this.editor;
				delete this.editor;
				this.setEditor(a);
				this.addEvents("click", "contextmenu", "dblclick", "mousedown");
				Ext.grid.Column.superclass.constructor.call(this)
			},
			processEvent : function (b, d, c, g, a) {
				return this.fireEvent(b, this, c, g, d)
			},
			destroy : function () {
				if (this.setEditor) {
					this.setEditor(null)
				}
				this.purgeListeners()
			},
			renderer : function (a) {
				return a
			},
			getEditor : function (a) {
				return this.editable !== false ? this.editor : null
			},
			setEditor : function (b) {
				var a = this.editor;
				if (a) {
					if (a.gridEditor) {
						a.gridEditor.destroy();
						delete a.gridEditor
					} else {
						a.destroy()
					}
				}
				this.editor = null;
				if (b) {
					if (!b.isXType) {
						b = Ext.create(b, "textfield")
					}
					this.editor = b
				}
			},
			getCellEditor : function (b) {
				var a = this.getEditor(b);
				if (a) {
					if (!a.startEdit) {
						if (!a.gridEditor) {
							a.gridEditor = new Ext.grid.GridEditor(a)
						}
						a = a.gridEditor
					}
				}
				return a
			}
		});
Ext.grid.BooleanColumn = Ext.extend(Ext.grid.Column, {
			trueText : "true",
			falseText : "false",
			undefinedText : "&#160;",
			constructor : function (a) {
				Ext.grid.BooleanColumn.superclass.constructor.call(this, a);
				var c = this.trueText,
				d = this.falseText,
				b = this.undefinedText;
				this.renderer = function (e) {
					if (e === undefined) {
						return b
					}
					if (!e || e === "false") {
						return d
					}
					return c
				}
			}
		});
Ext.grid.NumberColumn = Ext.extend(Ext.grid.Column, {
			format : "0,000.00",
			constructor : function (a) {
				Ext.grid.NumberColumn.superclass.constructor.call(this, a);
				this.renderer = Ext.util.Format.numberRenderer(this.format)
			}
		});
Ext.grid.DateColumn = Ext.extend(Ext.grid.Column, {
			format : "m/d/Y",
			constructor : function (a) {
				Ext.grid.DateColumn.superclass.constructor.call(this, a);
				this.renderer = Ext.util.Format.dateRenderer(this.format)
			}
		});
Ext.grid.TemplateColumn = Ext.extend(Ext.grid.Column, {
			constructor : function (a) {
				Ext.grid.TemplateColumn.superclass.constructor.call(this, a);
				var b = (!Ext.isPrimitive(this.tpl) && this.tpl.compile) ? this.tpl : new Ext.XTemplate(this.tpl);
				this.renderer = function (d, e, c) {
					return b.apply(c.data)
				};
				this.tpl = b
			}
		});
Ext.grid.ActionColumn = Ext.extend(Ext.grid.Column, {
			header : "&#160;",
			actionIdRe : /x-action-col-(\d+)/,
			altText : "",
			constructor : function (b) {
				var g = this,
				c = b.items || (g.items = [g]),
				a = c.length,
				d,
				e;
				Ext.grid.ActionColumn.superclass.constructor.call(g, b);
				g.renderer = function (h, i) {
					h = Ext.isFunction(b.renderer) ? b.renderer.apply(this, arguments) || "" : "";
					i.css += " x-action-col-cell";
					for (d = 0; d < a; d++) {
						e = c[d];
						h += '<img alt="' + (e.altText || g.altText) + '" src="' + (e.icon || Ext.BLANK_IMAGE_URL) + '" class="x-action-col-icon x-action-col-' + String(d) + " " + (e.iconCls || "") + " " + (Ext.isFunction(e.getClass) ? e.getClass.apply(e.scope || this.scope || this, arguments) : "") + '"' + ((e.tooltip) ? ' ext:qtip="' + e.tooltip + '"' : "") + " />"
					}
					return h
				}
			},
			destroy : function () {
				delete this.items;
				delete this.renderer;
				return Ext.grid.ActionColumn.superclass.destroy.apply(this, arguments)
			},
			processEvent : function (c, i, d, j, b) {
				var a = i.getTarget().className.match(this.actionIdRe),
				h,
				g;
				if (a && (h = this.items[parseInt(a[1], 10)])) {
					if (c == "click") {
						(g = h.handler || this.handler) && g.call(h.scope || this.scope || this, d, j, b, h, i)
					} else {
						if ((c == "mousedown") && (h.stopSelection !== false)) {
							return false
						}
					}
				}
				return Ext.grid.ActionColumn.superclass.processEvent.apply(this, arguments)
			}
		});
Ext.grid.Column.types = {
	gridcolumn : Ext.grid.Column,
	booleancolumn : Ext.grid.BooleanColumn,
	numbercolumn : Ext.grid.NumberColumn,
	datecolumn : Ext.grid.DateColumn,
	templatecolumn : Ext.grid.TemplateColumn,
	actioncolumn : Ext.grid.ActionColumn
};
Ext.grid.RowNumberer = Ext.extend(Object, {
			header : "",
			width : 23,
			sortable : false,
			constructor : function (a) {
				Ext.apply(this, a);
				if (this.rowspan) {
					this.renderer = this.renderer.createDelegate(this)
				}
			},
			fixed : true,
			hideable : false,
			menuDisabled : true,
			dataIndex : "",
			id : "numberer",
			rowspan : undefined,
			renderer : function (b, c, a, d) {
				if (this.rowspan) {
					c.cellAttr = 'rowspan="' + this.rowspan + '"'
				}
				return d + 1
			}
		});
Ext.grid.CheckboxSelectionModel = Ext.extend(Ext.grid.RowSelectionModel, {
			header : '<div class="x-grid3-hd-checker">&#160;</div>',
			width : 20,
			sortable : false,
			menuDisabled : true,
			fixed : true,
			hideable : false,
			dataIndex : "",
			id : "checker",
			isColumn : true,
			constructor : function () {
				Ext.grid.CheckboxSelectionModel.superclass.constructor.apply(this, arguments);
				if (this.checkOnly) {
					this.handleMouseDown = Ext.emptyFn
				}
			},
			initEvents : function () {
				Ext.grid.CheckboxSelectionModel.superclass.initEvents.call(this);
				this.grid.on("render", function () {
						Ext.fly(this.grid.getView().innerHd).on("mousedown", this.onHdMouseDown, this)
					}, this)
			},
			processEvent : function (b, d, c, g, a) {
				if (b == "mousedown") {
					this.onMouseDown(d, d.getTarget());
					return false
				} else {
					return Ext.grid.Column.prototype.processEvent.apply(this, arguments)
				}
			},
			onMouseDown : function (c, b) {
				if (c.button === 0 && b.className == "x-grid3-row-checker") {
					c.stopEvent();
					var d = c.getTarget(".x-grid3-row");
					if (d) {
						var a = d.rowIndex;
						if (this.isSelected(a)) {
							this.deselectRow(a)
						} else {
							this.selectRow(a, true);
							this.grid.getView().focusRow(a)
						}
					}
				}
			},
			onHdMouseDown : function (c, a) {
				if (a.className == "x-grid3-hd-checker") {
					c.stopEvent();
					var b = Ext.fly(a.parentNode);
					var d = b.hasClass("x-grid3-hd-checker-on");
					if (d) {
						b.removeClass("x-grid3-hd-checker-on");
						this.clearSelections()
					} else {
						b.addClass("x-grid3-hd-checker-on");
						this.selectAll()
					}
				}
			},
			renderer : function (b, c, a) {
				return '<div class="x-grid3-row-checker">&#160;</div>'
			},
			onEditorSelect : function (b, a) {
				if (a != b && !this.checkOnly) {
					this.selectRow(b)
				}
			}
		});
Ext.grid.CellSelectionModel = Ext.extend(Ext.grid.AbstractSelectionModel, {
			constructor : function (a) {
				Ext.apply(this, a);
				this.selection = null;
				this.addEvents("beforecellselect", "cellselect", "selectionchange");
				Ext.grid.CellSelectionModel.superclass.constructor.call(this)
			},
			initEvents : function () {
				this.grid.on("cellmousedown", this.handleMouseDown, this);
				this.grid.on(Ext.EventManager.getKeyEvent(), this.handleKeyDown, this);
				this.grid.getView().on({
						scope : this,
						refresh : this.onViewChange,
						rowupdated : this.onRowUpdated,
						beforerowremoved : this.clearSelections,
						beforerowsinserted : this.clearSelections
					});
				if (this.grid.isEditor) {
					this.grid.on("beforeedit", this.beforeEdit, this)
				}
			},
			beforeEdit : function (a) {
				this.select(a.row, a.column, false, true, a.record)
			},
			onRowUpdated : function (a, b, c) {
				if (this.selection && this.selection.record == c) {
					a.onCellSelect(b, this.selection.cell[1])
				}
			},
			onViewChange : function () {
				this.clearSelections(true)
			},
			getSelectedCell : function () {
				return this.selection ? this.selection.cell : null
			},
			clearSelections : function (b) {
				var a = this.selection;
				if (a) {
					if (b !== true) {
						this.grid.view.onCellDeselect(a.cell[0], a.cell[1])
					}
					this.selection = null;
					this.fireEvent("selectionchange", this, null)
				}
			},
			hasSelection : function () {
				return this.selection ? true : false
			},
			handleMouseDown : function (b, d, a, c) {
				if (c.button !== 0 || this.isLocked()) {
					return
				}
				this.select(d, a)
			},
			select : function (g, c, b, e, d) {
				if (this.fireEvent("beforecellselect", this, g, c) !== false) {
					this.clearSelections();
					d = d || this.grid.store.getAt(g);
					this.selection = {
						record : d,
						cell : [g, c]
					};
					if (!b) {
						var a = this.grid.getView();
						a.onCellSelect(g, c);
						if (e !== true) {
							a.focusCell(g, c)
						}
					}
					this.fireEvent("cellselect", this, g, c);
					this.fireEvent("selectionchange", this, this.selection)
				}
			},
			isSelectable : function (c, b, a) {
				return !a.isHidden(b)
			},
			onEditorKey : function (b, a) {
				if (a.getKey() == a.TAB) {
					this.handleKeyDown(a)
				}
			},
			handleKeyDown : function (j) {
				if (!j.isNavKeyPress()) {
					return
				}
				var d = j.getKey(),
				i = this.grid,
				p = this.selection,
				b = this,
				m = function (g, c, e) {
					return i.walkCells(g, c, e, i.isEditor && i.editing ? b.acceptsNav : b.isSelectable, b)
				},
				o,
				h,
				a,
				l,
				n;
				switch (d) {
				case j.ESC:
				case j.PAGE_UP:
				case j.PAGE_DOWN:
					break;
				default:
					j.stopEvent();
					break
				}
				if (!p) {
					o = m(0, 0, 1);
					if (o) {
						this.select(o[0], o[1])
					}
					return
				}
				o = p.cell;
				a = o[0];
				l = o[1];
				switch (d) {
				case j.TAB:
					if (j.shiftKey) {
						h = m(a, l - 1, -1)
					} else {
						h = m(a, l + 1, 1)
					}
					break;
				case j.DOWN:
					h = m(a + 1, l, 1);
					break;
				case j.UP:
					h = m(a - 1, l, -1);
					break;
				case j.RIGHT:
					h = m(a, l + 1, 1);
					break;
				case j.LEFT:
					h = m(a, l - 1, -1);
					break;
				case j.ENTER:
					if (i.isEditor && !i.editing) {
						i.startEditing(a, l);
						return
					}
					break
				}
				if (h) {
					a = h[0];
					l = h[1];
					this.select(a, l);
					if (i.isEditor && i.editing) {
						n = i.activeEditor;
						if (n && n.field.triggerBlur) {
							n.field.triggerBlur()
						}
						i.startEditing(a, l)
					}
				}
			},
			acceptsNav : function (c, b, a) {
				return !a.isHidden(b) && a.isCellEditable(b, c)
			}
		});
Ext.grid.EditorGridPanel = Ext.extend(Ext.grid.GridPanel, {
			clicksToEdit : 2,
			forceValidation : false,
			isEditor : true,
			detectEdit : false,
			autoEncode : false,
			trackMouseOver : false,
			initComponent : function () {
				Ext.grid.EditorGridPanel.superclass.initComponent.call(this);
				if (!this.selModel) {
					this.selModel = new Ext.grid.CellSelectionModel()
				}
				this.activeEditor = null;
				this.addEvents("beforeedit", "afteredit", "validateedit")
			},
			initEvents : function () {
				Ext.grid.EditorGridPanel.superclass.initEvents.call(this);
				this.getGridEl().on("mousewheel", this.stopEditing.createDelegate(this, [true]), this);
				this.on("columnresize", this.stopEditing, this, [true]);
				if (this.clicksToEdit == 1) {
					this.on("cellclick", this.onCellDblClick, this)
				} else {
					var a = this.getView();
					if (this.clicksToEdit == "auto" && a.mainBody) {
						a.mainBody.on("mousedown", this.onAutoEditClick, this)
					}
					this.on("celldblclick", this.onCellDblClick, this)
				}
			},
			onResize : function () {
				Ext.grid.EditorGridPanel.superclass.onResize.apply(this, arguments);
				var a = this.activeEditor;
				if (this.editing && a) {
					a.realign(true)
				}
			},
			onCellDblClick : function (b, c, a) {
				this.startEditing(c, a)
			},
			onAutoEditClick : function (c, b) {
				if (c.button !== 0) {
					return
				}
				var g = this.view.findRowIndex(b),
				a = this.view.findCellIndex(b);
				if (g !== false && a !== false) {
					this.stopEditing();
					if (this.selModel.getSelectedCell) {
						var d = this.selModel.getSelectedCell();
						if (d && d[0] === g && d[1] === a) {
							this.startEditing(g, a)
						}
					} else {
						if (this.selModel.isSelected(g)) {
							this.startEditing(g, a)
						}
					}
				}
			},
			onEditComplete : function (b, d, a) {
				this.editing = false;
				this.lastActiveEditor = this.activeEditor;
				this.activeEditor = null;
				var c = b.record,
				h = this.colModel.getDataIndex(b.col);
				d = this.postEditValue(d, a, c, h);
				if (this.forceValidation === true || String(d) !== String(a)) {
					var g = {
						grid : this,
						record : c,
						field : h,
						originalValue : a,
						value : d,
						row : b.row,
						column : b.col,
						cancel : false
					};
					if (this.fireEvent("validateedit", g) !== false && !g.cancel && String(d) !== String(a)) {
						c.set(h, g.value);
						delete g.cancel;
						this.fireEvent("afteredit", g)
					}
				}
				this.view.focusCell(b.row, b.col)
			},
			startEditing : function (i, c) {
				this.stopEditing();
				if (this.colModel.isCellEditable(c, i)) {
					this.view.ensureVisible(i, c, true);
					var d = this.store.getAt(i),
					h = this.colModel.getDataIndex(c),
					g = {
						grid : this,
						record : d,
						field : h,
						value : d.data[h],
						row : i,
						column : c,
						cancel : false
					};
					if (this.fireEvent("beforeedit", g) !== false && !g.cancel) {
						this.editing = true;
						var b = this.colModel.getCellEditor(c, i);
						if (!b) {
							return
						}
						if (!b.rendered) {
							b.parentEl = this.view.getEditorParent(b);
							b.on({
									scope : this,
									render : {
										fn : function (e) {
											e.field.focus(false, true)
										},
										single : true,
										scope : this
									},
									specialkey : function (k, j) {
										this.getSelectionModel().onEditorKey(k, j)
									},
									complete : this.onEditComplete,
									canceledit : this.stopEditing.createDelegate(this, [true])
								})
						}
						Ext.apply(b, {
								row : i,
								col : c,
								record : d
							});
						this.lastEdit = {
							row : i,
							col : c
						};
						this.activeEditor = b;
						b.selectSameEditor = (this.activeEditor == this.lastActiveEditor);
						var a = this.preEditValue(d, h);
						b.startEdit(this.view.getCell(i, c).firstChild, Ext.isDefined(a) ? a : "");
						(function () {
								delete b.selectSameEditor
							}).defer(50)
					}
				}
			},
			preEditValue : function (a, c) {
				var b = a.data[c];
				return this.autoEncode && Ext.isString(b) ? Ext.util.Format.htmlDecode(b) : b
			},
			postEditValue : function (c, a, b, d) {
				return this.autoEncode && Ext.isString(c) ? Ext.util.Format.htmlEncode(c) : c
			},
			stopEditing : function (b) {
				if (this.editing) {
					var a = this.lastActiveEditor = this.activeEditor;
					if (a) {
						a[b === true ? "cancelEdit" : "completeEdit"]();
						this.view.focusCell(a.row, a.col)
					}
					this.activeEditor = null
				}
				this.editing = false
			}
		});
Ext.reg("editorgrid", Ext.grid.EditorGridPanel);
Ext.grid.GridEditor = function (b, a) {
	Ext.grid.GridEditor.superclass.constructor.call(this, b, a);
	b.monitorTab = false
};
Ext.extend(Ext.grid.GridEditor, Ext.Editor, {
		alignment : "tl-tl",
		autoSize : "width",
		hideEl : false,
		cls : "x-small-editor x-grid-editor",
		shim : false,
		shadow : false
	});
Ext.grid.PropertyRecord = Ext.data.Record.create([{
				name : "name",
				type : "string"
			}, "value"]);
Ext.grid.PropertyStore = Ext.extend(Ext.util.Observable, {
			constructor : function (a, b) {
				this.grid = a;
				this.store = new Ext.data.Store({
							recordType : Ext.grid.PropertyRecord
						});
				this.store.on("update", this.onUpdate, this);
				if (b) {
					this.setSource(b)
				}
				Ext.grid.PropertyStore.superclass.constructor.call(this)
			},
			setSource : function (c) {
				this.source = c;
				this.store.removeAll();
				var b = [];
				for (var a in c) {
					if (this.isEditableValue(c[a])) {
						b.push(new Ext.grid.PropertyRecord({
									name : a,
									value : c[a]
								}, a))
					}
				}
				this.store.loadRecords({
						records : b
					}, {}, true)
			},
			onUpdate : function (e, a, d) {
				if (d == Ext.data.Record.EDIT) {
					var b = a.data.value;
					var c = a.modified.value;
					if (this.grid.fireEvent("beforepropertychange", this.source, a.id, b, c) !== false) {
						this.source[a.id] = b;
						a.commit();
						this.grid.fireEvent("propertychange", this.source, a.id, b, c)
					} else {
						a.reject()
					}
				}
			},
			getProperty : function (a) {
				return this.store.getAt(a)
			},
			isEditableValue : function (a) {
				return Ext.isPrimitive(a) || Ext.isDate(a)
			},
			setValue : function (d, c, a) {
				var b = this.getRec(d);
				if (b) {
					b.set("value", c);
					this.source[d] = c
				} else {
					if (a) {
						this.source[d] = c;
						b = new Ext.grid.PropertyRecord({
									name : d,
									value : c
								}, d);
						this.store.add(b)
					}
				}
			},
			remove : function (b) {
				var a = this.getRec(b);
				if (a) {
					this.store.remove(a);
					delete this.source[b]
				}
			},
			getRec : function (a) {
				return this.store.getById(a)
			},
			getSource : function () {
				return this.source
			}
		});
Ext.grid.PropertyColumnModel = Ext.extend(Ext.grid.ColumnModel, {
			nameText : "Name",
			valueText : "Value",
			dateFormat : "m/j/Y",
			trueText : "true",
			falseText : "false",
			constructor : function (c, b) {
				var d = Ext.grid,
				e = Ext.form;
				this.grid = c;
				d.PropertyColumnModel.superclass.constructor.call(this, [{
							header : this.nameText,
							width : 50,
							sortable : true,
							dataIndex : "name",
							id : "name",
							menuDisabled : true
						}, {
							header : this.valueText,
							width : 50,
							resizable : false,
							dataIndex : "value",
							id : "value",
							menuDisabled : true
						}
					]);
				this.store = b;
				var a = new e.Field({
							autoCreate : {
								tag : "select",
								children : [{
										tag : "option",
										value : "true",
										html : this.trueText
									}, {
										tag : "option",
										value : "false",
										html : this.falseText
									}
								]
							},
							getValue : function () {
								return this.el.dom.value == "true"
							}
						});
				this.editors = {
					date : new d.GridEditor(new e.DateField({
								selectOnFocus : true
							})),
					string : new d.GridEditor(new e.TextField({
								selectOnFocus : true
							})),
					number : new d.GridEditor(new e.NumberField({
								selectOnFocus : true,
								style : "text-align:left;"
							})),
					"boolean" : new d.GridEditor(a, {
							autoSize : "both"
						})
				};
				this.renderCellDelegate = this.renderCell.createDelegate(this);
				this.renderPropDelegate = this.renderProp.createDelegate(this)
			},
			renderDate : function (a) {
				return a.dateFormat(this.dateFormat)
			},
			renderBool : function (a) {
				return this[a ? "trueText" : "falseText"]
			},
			isCellEditable : function (a, b) {
				return a == 1
			},
			getRenderer : function (a) {
				return a == 1 ? this.renderCellDelegate : this.renderPropDelegate
			},
			renderProp : function (a) {
				return this.getPropertyName(a)
			},
			renderCell : function (d, b, c) {
				var a = this.grid.customRenderers[c.get("name")];
				if (a) {
					return a.apply(this, arguments)
				}
				var e = d;
				if (Ext.isDate(d)) {
					e = this.renderDate(d)
				} else {
					if (typeof d == "boolean") {
						e = this.renderBool(d)
					}
				}
				return Ext.util.Format.htmlEncode(e)
			},
			getPropertyName : function (b) {
				var a = this.grid.propertyNames;
				return a && a[b] ? a[b] : b
			},
			getCellEditor : function (a, e) {
				var b = this.store.getProperty(e),
				d = b.data.name,
				c = b.data.value;
				if (this.grid.customEditors[d]) {
					return this.grid.customEditors[d]
				}
				if (Ext.isDate(c)) {
					return this.editors.date
				} else {
					if (typeof c == "number") {
						return this.editors.number
					} else {
						if (typeof c == "boolean") {
							return this.editors["boolean"]
						} else {
							return this.editors.string
						}
					}
				}
			},
			destroy : function () {
				Ext.grid.PropertyColumnModel.superclass.destroy.call(this);
				this.destroyEditors(this.editors);
				this.destroyEditors(this.grid.customEditors)
			},
			destroyEditors : function (b) {
				for (var a in b) {
					Ext.destroy(b[a])
				}
			}
		});
Ext.grid.PropertyGrid = Ext.extend(Ext.grid.EditorGridPanel, {
			enableColumnMove : false,
			stripeRows : false,
			trackMouseOver : false,
			clicksToEdit : 1,
			enableHdMenu : false,
			viewConfig : {
				forceFit : true
			},
			initComponent : function () {
				this.customRenderers = this.customRenderers || {};
				this.customEditors = this.customEditors || {};
				this.lastEditRow = null;
				var b = new Ext.grid.PropertyStore(this);
				this.propStore = b;
				var a = new Ext.grid.PropertyColumnModel(this, b);
				b.store.sort("name", "ASC");
				this.addEvents("beforepropertychange", "propertychange");
				this.cm = a;
				this.ds = b.store;
				Ext.grid.PropertyGrid.superclass.initComponent.call(this);
				this.mon(this.selModel, "beforecellselect", function (e, d, c) {
						if (c === 0) {
							this.startEditing.defer(200, this, [d, 1]);
							return false
						}
					}, this)
			},
			onRender : function () {
				Ext.grid.PropertyGrid.superclass.onRender.apply(this, arguments);
				this.getGridEl().addClass("x-props-grid")
			},
			afterRender : function () {
				Ext.grid.PropertyGrid.superclass.afterRender.apply(this, arguments);
				if (this.source) {
					this.setSource(this.source)
				}
			},
			setSource : function (a) {
				this.propStore.setSource(a)
			},
			getSource : function () {
				return this.propStore.getSource()
			},
			setProperty : function (c, b, a) {
				this.propStore.setValue(c, b, a)
			},
			removeProperty : function (a) {
				this.propStore.remove(a)
			}
		});
Ext.reg("propertygrid", Ext.grid.PropertyGrid);
Ext.grid.GroupingView = Ext.extend(Ext.grid.GridView, {
			groupByText : "Group By This Field",
			showGroupsText : "Show in Groups",
			hideGroupedColumn : false,
			showGroupName : true,
			startCollapsed : false,
			enableGrouping : true,
			enableGroupingMenu : true,
			enableNoGroups : true,
			emptyGroupText : "(None)",
			ignoreAdd : false,
			groupTextTpl : "{text}",
			groupMode : "value",
			cancelEditOnToggle : true,
			initTemplates : function () {
				Ext.grid.GroupingView.superclass.initTemplates.call(this);
				this.state = {};
				var a = this.grid.getSelectionModel();
				a.on(a.selectRow ? "beforerowselect" : "beforecellselect", this.onBeforeRowSelect, this);
				if (!this.startGroup) {
					this.startGroup = new Ext.XTemplate('<div id="{groupId}" class="x-grid-group {cls}">', '<div id="{groupId}-hd" class="x-grid-group-hd" style="{style}"><div class="x-grid-group-title">', this.groupTextTpl, "</div></div>", '<div id="{groupId}-bd" class="x-grid-group-body">')
				}
				this.startGroup.compile();
				if (!this.endGroup) {
					this.endGroup = "</div></div>"
				}
			},
			findGroup : function (a) {
				return Ext.fly(a).up(".x-grid-group", this.mainBody.dom)
			},
			getGroups : function () {
				return this.hasRows() ? this.mainBody.dom.childNodes : []
			},
			onAdd : function (d, a, b) {
				if (this.canGroup() && !this.ignoreAdd) {
					var c = this.getScrollState();
					this.fireEvent("beforerowsinserted", d, b, b + (a.length - 1));
					this.refresh();
					this.restoreScroll(c);
					this.fireEvent("rowsinserted", d, b, b + (a.length - 1))
				} else {
					if (!this.canGroup()) {
						Ext.grid.GroupingView.superclass.onAdd.apply(this, arguments)
					}
				}
			},
			onRemove : function (e, a, b, d) {
				Ext.grid.GroupingView.superclass.onRemove.apply(this, arguments);
				var c = document.getElementById(a._groupId);
				if (c && c.childNodes[1].childNodes.length < 1) {
					Ext.removeNode(c)
				}
				this.applyEmptyText()
			},
			refreshRow : function (a) {
				if (this.ds.getCount() == 1) {
					this.refresh()
				} else {
					this.isUpdating = true;
					Ext.grid.GroupingView.superclass.refreshRow.apply(this, arguments);
					this.isUpdating = false
				}
			},
			beforeMenuShow : function () {
				var c,
				a = this.hmenu.items,
				b = this.cm.config[this.hdCtxIndex].groupable === false;
				if ((c = a.get("groupBy"))) {
					c.setDisabled(b)
				}
				if ((c = a.get("showGroups"))) {
					c.setDisabled(b);
					c.setChecked(this.canGroup(), true)
				}
			},
			renderUI : function () {
				var a = Ext.grid.GroupingView.superclass.renderUI.call(this);
				if (this.enableGroupingMenu && this.hmenu) {
					this.hmenu.add("-", {
							itemId : "groupBy",
							text : this.groupByText,
							handler : this.onGroupByClick,
							scope : this,
							iconCls : "x-group-by-icon"
						});
					if (this.enableNoGroups) {
						this.hmenu.add({
								itemId : "showGroups",
								text : this.showGroupsText,
								checked : true,
								checkHandler : this.onShowGroupsClick,
								scope : this
							})
					}
					this.hmenu.on("beforeshow", this.beforeMenuShow, this)
				}
				return a
			},
			processEvent : function (b, i) {
				Ext.grid.GroupingView.superclass.processEvent.call(this, b, i);
				var h = i.getTarget(".x-grid-group-hd", this.mainBody);
				if (h) {
					var g = this.getGroupField(),
					d = this.getPrefix(g),
					a = h.id.substring(d.length),
					c = new RegExp("gp-" + Ext.escapeRe(g) + "--hd");
					a = a.substr(0, a.length - 3);
					if (a || c.test(h.id)) {
						this.grid.fireEvent("group" + b, this.grid, g, a, i)
					}
					if (b == "mousedown" && i.button == 0) {
						this.toggleGroup(h.parentNode)
					}
				}
			},
			onGroupByClick : function () {
				var a = this.grid;
				this.enableGrouping = true;
				a.store.groupBy(this.cm.getDataIndex(this.hdCtxIndex));
				a.fireEvent("groupchange", a, a.store.getGroupState());
				this.beforeMenuShow();
				this.refresh()
			},
			onShowGroupsClick : function (a, b) {
				this.enableGrouping = b;
				if (b) {
					this.onGroupByClick()
				} else {
					this.grid.store.clearGrouping();
					this.grid.fireEvent("groupchange", this, null)
				}
			},
			toggleRowIndex : function (c, a) {
				if (!this.canGroup()) {
					return
				}
				var b = this.getRow(c);
				if (b) {
					this.toggleGroup(this.findGroup(b), a)
				}
			},
			toggleGroup : function (c, b) {
				var a = Ext.get(c),
				d = Ext.util.Format.htmlEncode(a.id);
				b = Ext.isDefined(b) ? b : a.hasClass("x-grid-group-collapsed");
				if (this.state[d] !== b) {
					if (this.cancelEditOnToggle !== false) {
						this.grid.stopEditing(true)
					}
					this.state[d] = b;
					a[b ? "removeClass" : "addClass"]("x-grid-group-collapsed")
				}
			},
			toggleAllGroups : function (c) {
				var b = this.getGroups();
				for (var d = 0, a = b.length; d < a; d++) {
					this.toggleGroup(b[d], c)
				}
			},
			expandAllGroups : function () {
				this.toggleAllGroups(true)
			},
			collapseAllGroups : function () {
				this.toggleAllGroups(false)
			},
			getGroup : function (a, e, i, j, b, h) {
				var c = this.cm.config[b],
				d = i ? i.call(c.scope, a, {}, e, j, b, h) : String(a);
				if (d === "" || d === "&#160;") {
					d = c.emptyGroupText || this.emptyGroupText
				}
				return d
			},
			getGroupField : function () {
				return this.grid.store.getGroupState()
			},
			afterRender : function () {
				if (!this.ds || !this.cm) {
					return
				}
				Ext.grid.GroupingView.superclass.afterRender.call(this);
				if (this.grid.deferRowRender) {
					this.updateGroupWidths()
				}
			},
			afterRenderUI : function () {
				Ext.grid.GroupingView.superclass.afterRenderUI.call(this);
				if (this.enableGroupingMenu && this.hmenu) {
					this.hmenu.add("-", {
							itemId : "groupBy",
							text : this.groupByText,
							handler : this.onGroupByClick,
							scope : this,
							iconCls : "x-group-by-icon"
						});
					if (this.enableNoGroups) {
						this.hmenu.add({
								itemId : "showGroups",
								text : this.showGroupsText,
								checked : true,
								checkHandler : this.onShowGroupsClick,
								scope : this
							})
					}
					this.hmenu.on("beforeshow", this.beforeMenuShow, this)
				}
			},
			renderRows : function () {
				var a = this.getGroupField();
				var e = !!a;
				if (this.hideGroupedColumn) {
					var b = this.cm.findColumnIndex(a),
					d = Ext.isDefined(this.lastGroupField);
					if (!e && d) {
						this.mainBody.update("");
						this.cm.setHidden(this.cm.findColumnIndex(this.lastGroupField), false);
						delete this.lastGroupField
					} else {
						if (e && !d) {
							this.lastGroupField = a;
							this.cm.setHidden(b, true)
						} else {
							if (e && d && a !== this.lastGroupField) {
								this.mainBody.update("");
								var c = this.cm.findColumnIndex(this.lastGroupField);
								this.cm.setHidden(c, false);
								this.lastGroupField = a;
								this.cm.setHidden(b, true)
							}
						}
					}
				}
				return Ext.grid.GroupingView.superclass.renderRows.apply(this, arguments)
			},
			doRender : function (c, h, q, a, p, s) {
				if (h.length < 1) {
					return ""
				}
				if (!this.canGroup() || this.isUpdating) {
					return Ext.grid.GroupingView.superclass.doRender.apply(this, arguments)
				}
				var z = this.getGroupField(),
				o = this.cm.findColumnIndex(z),
				w,
				j = "width:" + this.getTotalWidth() + ";",
				e = this.cm.config[o],
				b = e.groupRenderer || e.renderer,
				t = this.showGroupName ? (e.groupName || e.header) + ": " : "",
				y = [],
				l,
				u,
				v,
				n;
				for (u = 0, v = h.length; u < v; u++) {
					var k = a + u,
					m = h[u],
					d = m.data[z];
					w = this.getGroup(d, m, b, k, o, q);
					if (!l || l.group != w) {
						n = this.constructId(d, z, o);
						this.state[n] = !(Ext.isDefined(this.state[n]) ? !this.state[n] : this.startCollapsed);
						l = {
							group : w,
							gvalue : d,
							text : t + w,
							groupId : n,
							startRow : k,
							rs : [m],
							cls : this.state[n] ? "" : "x-grid-group-collapsed",
							style : j
						};
						y.push(l)
					} else {
						l.rs.push(m)
					}
					m._groupId = n
				}
				var x = [];
				for (u = 0, v = y.length; u < v; u++) {
					w = y[u];
					this.doGroupStart(x, w, c, q, p);
					x[x.length] = Ext.grid.GroupingView.superclass.doRender.call(this, c, w.rs, q, w.startRow, p, s);
					this.doGroupEnd(x, w, c, q, p)
				}
				return x.join("")
			},
			getGroupId : function (a) {
				var b = this.getGroupField();
				return this.constructId(a, b, this.cm.findColumnIndex(b))
			},
			constructId : function (c, e, a) {
				var b = this.cm.config[a],
				d = b.groupRenderer || b.renderer,
				g = (this.groupMode == "value") ? c : this.getGroup(c, {
						data : {}
						
					}, d, 0, a, this.ds);
				return this.getPrefix(e) + Ext.util.Format.htmlEncode(g)
			},
			canGroup : function () {
				return this.enableGrouping && !!this.getGroupField()
			},
			getPrefix : function (a) {
				return this.grid.getGridEl().id + "-gp-" + a + "-"
			},
			doGroupStart : function (a, d, b, e, c) {
				a[a.length] = this.startGroup.apply(d)
			},
			doGroupEnd : function (a, d, b, e, c) {
				a[a.length] = this.endGroup
			},
			getRows : function () {
				if (!this.canGroup()) {
					return Ext.grid.GroupingView.superclass.getRows.call(this)
				}
				var k = [],
				c = this.getGroups(),
				h,
				e = 0,
				a = c.length,
				d,
				b;
				for (; e < a; ++e) {
					h = c[e].childNodes[1];
					if (h) {
						h = h.childNodes;
						for (d = 0, b = h.length; d < b; ++d) {
							k[k.length] = h[d]
						}
					}
				}
				return k
			},
			updateGroupWidths : function () {
				if (!this.canGroup() || !this.hasRows()) {
					return
				}
				var c = Math.max(this.cm.getTotalWidth(), this.el.dom.offsetWidth - this.getScrollOffset()) + "px";
				var b = this.getGroups();
				for (var d = 0, a = b.length; d < a; d++) {
					b[d].firstChild.style.width = c
				}
			},
			onColumnWidthUpdated : function (c, a, b) {
				Ext.grid.GroupingView.superclass.onColumnWidthUpdated.call(this, c, a, b);
				this.updateGroupWidths()
			},
			onAllColumnWidthsUpdated : function (a, b) {
				Ext.grid.GroupingView.superclass.onAllColumnWidthsUpdated.call(this, a, b);
				this.updateGroupWidths()
			},
			onColumnHiddenUpdated : function (b, c, a) {
				Ext.grid.GroupingView.superclass.onColumnHiddenUpdated.call(this, b, c, a);
				this.updateGroupWidths()
			},
			onLayout : function () {
				this.updateGroupWidths()
			},
			onBeforeRowSelect : function (b, a) {
				this.toggleRowIndex(a, true)
			}
		});
Ext.grid.GroupingView.GROUP_ID = 1000;
 